Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Добавление пользовательских свойств не наследуясь (http://www.flasher.ru/forum/showthread.php?t=111302)

mre 21.04.2008 17:50

Добавление пользовательских свойств не наследуясь
 
Например я создаю экземпляр Sprite.
Код:

var s:Sprite = new Sprite();
Могу ли я добавить к нему какое-либо свое свойсво, например,
Код:

s.test = new Object();
но при этом не создавать наследника от Sprite со свойством test, а как-нибудь проще.
Идея в том что мне нужно хранить кое-какое значение в экземпляре, но не хочу для этого создавать подкласс.
Это не сложно, но такая ситуация встречается довольно часто, не хочется чтобы накапливались мелкие файлы подклассов.

etc 21.04.2008 17:56

Нет, не можете. Sprite не является динамическим классом. Но вы можете написать наследника Sprite и объявить его динамическим.

vooparker 21.04.2008 18:00

Вместо Sprite можно использовать MovieClip.
Однако динамикой увлекаться опасно.

mre 21.04.2008 18:07

Ясно, спасибо.

_Smirnoff 23.04.2008 17:51

Если не знаешь ООП, лучше выучи, в жизни пригодиться....Как я прочел в одной умной книге "К сожалению, основы объектно-ориентированных языков остаются за рамками этой книги, поэтому те, кто считает, что ООП — это Организация Освобождения Палестины, могут на этом этапе почитать дополнительную литературу" :)

mre 24.04.2008 11:22

А из какой ноты следует что я не знаю ООП?

Mr. Fixit 24.04.2008 12:18

Цитата:

Идея в том что мне нужно хранить кое-какое значение в экземпляре, но не хочу для этого создавать подкласс.
Это не сложно, но такая ситуация встречается довольно часто, не хочется чтобы накапливались мелкие файлы подклассов.
Если вы хотите правильно структурированый Ваш код, то это обязательно :).

vooparker 24.04.2008 12:58

2Mr. Fixit:
значит большое количество мелких подклассов это хорошо структурированный код?

Mr. Fixit 24.04.2008 13:07

да :)
Все присутсвует, и все видно, и не надо гадать при просмотре кода через пару месяцев. И это, можно примерчик вашего "мелкого" класса?

vooparker 24.04.2008 13:32

Порождение мелких подклассов это как раз очень плохая практика.

Mr. Fixit 24.04.2008 13:43

Я выслушал ваше мнение, но могли бы вы, всетаки, привести пример вашого мелкого класса?

vooparker 24.04.2008 13:45

у меня таких и нет =)

Mr. Fixit 24.04.2008 13:47

Цитата:

у меня таких и нет =)
Ну тогда если нету, почему вы рассуждаете что это плохая практика? Если у вас это только в теории.

vooparker 24.04.2008 13:56

Потому что это очевидно =) Немного конечно не в тему, поднятую автором, но могу предложить почитать пример как правильно и красиво можно избавиться от порождения ненужных классов http://yarovoy.com/2007/08/30/prototype_design_pattern/

Mr. Fixit 24.04.2008 14:09

Лушче использывать мелкие классы, но разумно(это ессно).
Цитата:

Потому что это очевидно =)
Если тупо смотреть с одного угла, то - да.

Я, лично рассматриваю проблему под разными углами.
Имхо, подход через шаблон Прототип мне не нравится.

vooparker 24.04.2008 14:22

Прототип особенно хорош в играх когда множество "врагов" или "препятствий" описано одним классом, а не множеством однотипных. Что касается необходимости в мелких классах она есть, те же dto например, но речь шла изначально о другой проблеме - о нежелании создания множества мелких подклассов ради наделения их какими-то дополнительными свойствами. И в этой ситуации порождение такого множества и есть плохая практика.

Mr. Fixit 24.04.2008 14:27

Цитата:

о нежелании создания множества мелких подклассов ради наделения их какими-то дополнительными свойствами
Если этот класс уникален в своем случае, то его стоит создавать. Или,, например, создать один управляющий класс, от которого будут наследоваться нужные экземплряры, таким путём не создавая пустые ненужные классы. :)

vooparker 24.04.2008 14:29

Цитата:

Сообщение от Mr. Fixit (Сообщение 735223)
Если этот класс уникален в своем случае, то его стоит создавать...

Земля круглая, через две точки на плоскости можно провести одну и только одну прямую и тд

Mr. Fixit 24.04.2008 14:45

и?
Конечно круто начать нести какой-то спам, чем прийти совместно к более правильному решению, но дело ваше :D

Кста пример:
Код:

...
public function Main() {
        var _obj1 : ClassesManager = new ClassesManager();
        _obj1.params = {x:10};
        trace(_obj1.params['x']);
                       
        var _obj2 : ClassesManager = new ClassesManager();
        _obj2.params = {func:_obj2.someFunc([777])};
        trace(_obj2.params['func']);
}

...

public class ClassesManager extends Sprite {
        private var _params : Object = new Object();

        public function ClassesManager() {
                // *** Empty
        }
               
        public function get params() : Object {
                return this._params;
        }
               
        public function set params(params : Object) : void {
                this._params = params;
        }
               
        public function someFunc(someArray : Array) : Array {
                return someArray;
        }
}
...


vooparker 24.04.2008 15:07

Цитата:

Сообщение от mre (Сообщение 734431)
Идея в том что мне нужно хранить кое-какое значение в экземпляре, но не хочу для этого создавать подкласс.
Это не сложно, но такая ситуация встречается довольно часто, не хочется чтобы накапливались мелкие файлы подклассов.

Цитата:

Сообщение от Mr. Fixit (Сообщение 735172)
Если вы хотите правильно структурированый Ваш код, то это обязательно :).

Приведенный вами пример, насколько я понимаю опровергает ваше же утверждение? =)

Mr. Fixit 24.04.2008 15:12

Ы) Ну я в процессе нашего диалога пришел к более правильному подходу в рамках данной задачи, да опровергнул и я рад, что прогрессирую)
А че? :cool:
:D

vooparker 24.04.2008 15:15

Просто именно к этому и я пытался подвести нашу дискуссию

Mr. Fixit 24.04.2008 15:25

Ну вы постарались, спасибо. :drinks:

mre 24.04.2008 17:19

Да, типа такого, чтобы добавить поле test к Sprite:
Код:

package objects
{
        import flash.display.Sprite;
       
        public class Logo extends Sprite
        {
                public var test:Number;

                public function Logo()
                {
                        super();
                }
        }
}



Часовой пояс GMT +4, время: 12:29.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.