Просмотр полной версии : попытка разобраться с классами
gloomyBrain
01.08.2008, 00:29
сразу к сути:
Есть в библиотеке несколько мувиклипов. И есть (вернее в разработке) класс, содержащий свойства и методы. По задумке при вызове конструктора класса ему (конструктору) передаётся параметр, говорящий о том, какой именно мувиклип необходимо приаттачить из библиотеки и наделить оный же описанным в теле класса набором свойств и методов.
Как я понимаю, класс должен начинаться так:
class Unit extends MovieClip{
...
}
Помогите пожалуйста с видом конструктора класса. Как передать в конструктор параметр? И как научить основной таймлайн создавать объекты этого класса?
:wacko:
Если классу клип передается в параметре, то зачем его от MpvieClip наследовать?
Конструктор в АС - одноименная с классом функция объявленная в теле класса. В АС2 может быть и public и private, не может возвращать значение.
Импортировать класс:
import my.class.location.MyClass;
При условии, что:
Папка my находится на класспассе.
В папке my есть папка class, в ней location, а в этой последней есть файл MyClass.as.
Класс MyClass объявлен как
my.class.location.MyClass extends [whatever] implements [whatever]
{
public function MyClass(clip:MovieClip)
{
super();
}
}
Путь к классу принято составлять по такому принципу:
[домейн третего уровня вашего сайта: пример com].[домейн второго уровня вашего сайта: пример mysite].[логическая категория, к которой можно отнести класс: пример utilities].
Т.е. если ваш сайт находится по аддрессу: www.mysite.com, то класс будет называться как-нибудь так:
com.mysite.utilities.MyClass
gloomyBrain
01.08.2008, 01:01
Спасибо большое wvxvw !
пока всё понятно, и(!) даже работает
Буду эксперементировать
gloomyBrain
01.08.2008, 01:34
кстати еще вопросик возник:
приаттачить клип получилось так
class Unit {
private var _type:String = null;
public function Unit(sType:String, sName:String) {
_root.attachMovie(sType, sName, _root.getNextHighestDepth());
}
}
но это не лучший вариант в моём понимании. Ведь возникнет необходимость отслеживать изменение свойств мувика
и тогда придётся делать через watch()
не охота =)
А можно ли мувик из библиотеки сделать экземпляром класса и как?
С учётом того что какой именно мувик - изначально неизвестно
crazyone
01.08.2008, 12:43
Путь к классу принято составлять по такому принципу:
[домейн третего уровня вашего сайта: пример com].[домейн второго уровня вашего сайта: пример mysite].[логическая категория, к которой можно отнести класс: пример utilities].
Я, конечно, не эксперт в этом деле, но что-то мне подсказывает, что общепринятый принцип немного другой и к доменному имени сайта относится не сильно:
[Часть, отвечающая за назначение и условия распространения проекта. Я встречал com и org, что говорит о коммерческом или организационном назначении].[имя автора или название авторской организации].[имя проекта].[логическая категория, к которой можно отнести класс: пример utilities].[Название класса]
А можно ли мувик из библиотеки сделать экземпляром класса и как?
С учётом того что какой именно мувик - изначально неизвестно
Да, нужно в свойствах Linkage этого мувика указать поле AS 2.0 class.
Систему именования просто позаимствовали из Джавы, откровенно говоря, я не совсем понимаю зачем нужны вообще com/org/что бы то ни было в начале. Т.как эти сокращения давным давно потеряли свое прямое значение. Пример, классы senocular находятся в пакете com.senocular.[whatever], и при этом они используют GDL т.е. абсолютно не коммерческие. просто его сайт тоже senocular.com. Да и вообще, почему-то каждый считает своим долгом изобрести колесо, когда придумывает как ему называть классы =) У MDM, например, классы почему-то называются mdm.[whatever].[ClassName] ну и т.д.
Но в Джаве есть смысл называть именно иcxодя из названия сайта т.как потом легче будет в автоматическом режиме апдейтить импортированые библиотеки, во флеш такая штука пока никак ни в одном ИДЕ не предусмотрена, но я бы все-таки следовал этому принципу, чтобы в случае, если кто-то реализует, можно было бы воспользоваться, а не переделывать =)
crazyone
01.08.2008, 18:41
что такое GDL?
Ну вообще стандартов нет, насколько я знаю =) Потому можно использовать, как удобнее.
gloomyBrain
02.08.2008, 00:02
по поводу линкейджа в библиотеке - тогда придётся всем мувикам прописывать
я собираю конструктор, который САМ определяет какой мувик добавить и исходя из этого - какие свойства и методы назначить помимо стандартных мувиклиповских
Инженерная мысль дошла вот до чего
class Unit{
private var _type:String=null;
public function Unit(sTipe:String, sName){
var myClip:MovieClip = _root.attachMovie(sType, sName, _root.getNextHighestDepth())
}
//самое интересное
public function get _x(){
return myClip._x
}
public function set _x(){
myClip._x=_x
}
}
Сразу прошу извинить за сырой и неопробованный код, но...
а осуществим такой подход? как вы думаете?
crazyone
02.08.2008, 03:52
Так а что вы сделать хотите-то?
что такое GDL?
GDL = General Developer License.
В принципе, аналогично GPL (General Public License). С разницей в том, что специально указано, что код можно модифицировать как угодно, использовать в своих коммерческих проэктах и т.п.
Сразу прошу извинить за сырой и неопробованный код, но...
а осуществим такой подход? как вы думаете?
Да, осуществим, это даже есть такой шаблон проэктирования, называется "обертка". Только в случае с АС2, лучше свойства/методы у класса-обертки по-другому как-нибудь называть, а то например, если создать метод onRelease, то потом могут возникнуть сложности с его вызовом, а так вообще идея нормальная, по такому же принципу сделан класс UIObject.
gloomyBrain
03.08.2008, 00:18
2 crazyone:
обёртку=) сам не знал, что так бывает, но название в полной мере подходящее
Смысл в том, что при вызове конструктора создаётся объект класса И объект MovieClip. Когда вызывается некоторый метод (например из рута назначается координата _x для объекта класса) - объект класса реагирует так: меняет соответствующим образом параметры MovieClip.
2 wvxvw:
А зачем вызывать метод onRelease() для класса? Я планирую такого рода методы прописывать для самого мувиклипа при его создании. Он-то на сцене явно виден и осязаем.
снова 2 crazyone:
хочу сделать класс, объект которого был бы:
-визуально мувиклипом
-обладал бы дополнительными свойствами и методами
-имел возможность отслеживать изменения собственных свойств
-вызывался так: purumPumPum:CrazyTwo = new CrazyTwo(pum, purum, pum)
chingachgoog
04.08.2008, 11:48
Возможно, будет полезным почитать вот это:
класс, унаследованный от MovieClip без библиотеки (http://flasher.ru/forum/showthread.php?t=11392)
crazyone
04.08.2008, 12:24
А, ну тогда логично делать это через композицию. Ну или обертку, если точнее.
Ну, я имею ввиду, что вы двигаетесь в правильном направлении.
Я так понимаю, что проблем у вас пока нет?
Обращайтесь, если что.
И да, мне всегда было лень делать обертки, я никогда не брезговал создавать объект класса через статический метод класса. Т.е. я хотел иметь нормальный конструктор у своих классов, но оценив затраты времени и сил под это понял, что лучше все-же статический метод.
gloomyBrain
05.08.2008, 21:35
2 chingachgoog
Спасибо, тема классная. Правда я на неё уже натыкался, но, признаюсь, должного внимания не уделил... =)
2 crazyone
не заставлю Вас долго ждать с каверзными вопросами, будьте уверены=)
Всем огромное спасибо!
зы
__proto__...
__proto__...
__proto__?!
=)
crazyone
06.08.2008, 14:21
__proto__ - это свойство, которое дается каждому из объектов. Указывает на то же, на что свойство prototype у класса этого объекта.
т.е.:
var obj=new MyClass();
trace(obj.__proto__==MyClass.prototype);//true
Ну а свойство prototype у класса указывает на конструктор родительского класса.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.