![]() |
|
||||||||||
|
|
|
|||||
|
Такой вот вопрос интересный возник.
Допустим : class Component extends Sprite implements IComponent // var a:IComponent = new Component(); addChild(a) // exeption in Component class : function get instance():Sprite { return this }; // addChild(a.instance) Реально ли вообще обяснить компилятору что это DO без явново указания на это? P.s - еще хуже чем get instance
__________________
Марк Tween |
|
|||||
|
Цитата:
Т.к. интерфеса IDisplayObject нет, то без приведения типов никак. а избавиться от приведения типов с помощью такого трюка: public interface IRenderer { function get displayObject():DisplayObject; function get data():Object; function set data(value:Object):void; } Даже появляется некоторая гибкость (не сильно нужная, правда), например, можно реализовать интерфейс классом, не являющимся наследником DisplayObject. Проблем, чуток больше, конечно, чем если бы был интерфейс IDisplayObject, но, все же менее проблематично чем разбрасывать приведения типов по коду. Пример: Была проблема с использованием 2-х GUI-фреймворков. Были менеджеры переключения кнопок, классы пролистывания списков, в которых исползовались кнопки. Только вот кнопки в 2-х фреймворках наследовались от разных классов и подставить их обоих в эти менеджеры не получалось. Как выход - это сделать интерфейс, и отнаследоваться от обоих фреймворков с реализацией этого интерфейса, а добавление сделать через метод get displayObject(). Цитата:
придется вместо интерфейса использовать одну из его реализаций(а именно Component) - другую передать не получится, т.е. смысл использования интерфейса теряется. Последний раз редактировалось expl; 20.11.2011 в 15:47. |
|
|||||
|
Погоди, ты же сам его используешь:
// кусок кода из Component, который реализует интерфейс IComponent public function get instance():Sprite { return this }; //Код где-то в каком-то классе, который обрабатывает IComponent public functin doSomething(a:IComponent):void { addChild(a.instance); ... // работа с другими методами IComponent } |
|
|||||
|
Я путей красивше не знаю (по мне и этот сойдет вполне).
Зато знаю извращённее :public interface IComponent { function addSelfTo(container:DisplayObjectContainer):void; function removeSelf():void; } // Код компонента: public class Component extends Sprite implements IComponent { ... public function addSelfTo(container:DisplayObjectContainer):void { container.addChild(this); } ... } //Код где-то в каком-то классе, который обрабатывает IComponent public functin doSomething(a:IComponent):void { a.addSelfTo(this); ... // работа с другими методами IComponent } |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
ужас((
Цитата:
Цитата:
Добавлено через 23 минуты Первый принцип SOLID – SPR, принцип единой ответственности (обязанности). Если Вы построили метод таким образом, что он принимает у Вас один тип данных, а работает почему-то с другим – это проблемы не языка, а архитектуры. Метод должен делать одно изменение. Естественно, это в идеале. Но если Вы решили нарушить этот принцип, а потом для избавления от возникших проблем согласны еще и сломать инкапсуляцию и иерархию, передавая детям ссылки на родителей, то тут даже ни о чем хорошем речи нет, не то что об идеальном.
__________________
Reality.getBounds(this); |
|
|||||
|
addChild() само собой при этом должен был бы принимать IDisplayObject, но это все фантазии, надо радоваться что adobe вобщем достаточно удачно API плеера спроектировала.
Ну не DO, видимо, потому что надо какие-то фишки Sprite использовать, или просто потому что пофиг. А хуже тем что приведение типов. не, если бы динамика (в частности динамическое приведение типов) было бы злом - языки с динамической типизацией щас бы так активно не использовались. Но когда в коде куча приведений типов - значит что-то не так в датском королевстве. И типизация облегчает рефакторинг. |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:33. |
|
|
« Предыдущая тема | Следующая тема » |
|
|