Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 20.11.2011, 15:32
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 1  
Ответить с цитированием
in4core
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
По умолчанию addChild не используя DO наглядно.

Такой вот вопрос интересный возник.
Допустим :
Код AS3:
class Component extends Sprite implements IComponent
//
var a:IComponent = new Component();
addChild(a) // exeption
Есть вариант решения :

Код AS3:
in Component class :
 
function get instance():Sprite { return this };
//
addChild(a.instance)
Но это как то выглядеть неприятно.
Реально ли вообще обяснить компилятору что это DO без явново указания на это?
P.s
Код AS3:
addChild(a as Sprite)
- еще хуже чем get instance
__________________
Марк Tween

Старый 20.11.2011, 15:36
zuxul вне форума Посмотреть профиль Отправить личное сообщение для zuxul Найти все сообщения от zuxul
  № 2  
Ответить с цитированием
zuxul

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
такой подойдет?
Код AS3:
var b:Component = new Component();
var a:IComponent = b;
addChild(b);

Старый 20.11.2011, 15:38
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 3  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
addChild(a) // exeption
не exeption, а ошибка времени компиляции

Т.к. интерфеса IDisplayObject нет, то без приведения типов никак.
а избавиться от приведения типов с помощью такого трюка:
Код AS3:
public interface IRenderer
{
    function get displayObject():DisplayObject;
    function get data():Object;
    function set data(value:Object):void;
}
- это вполне кошерно, ИМХО.
Даже появляется некоторая гибкость (не сильно нужная, правда), например, можно реализовать интерфейс классом, не являющимся наследником DisplayObject.

Проблем, чуток больше, конечно, чем если бы был интерфейс IDisplayObject, но, все же менее проблематично чем разбрасывать приведения типов по коду.

Пример:
Была проблема с использованием 2-х GUI-фреймворков. Были менеджеры переключения кнопок, классы пролистывания списков, в которых исползовались кнопки. Только вот кнопки в 2-х фреймворках наследовались от разных классов и подставить их обоих в эти менеджеры не получалось.
Как выход - это сделать интерфейс, и отнаследоваться от обоих фреймворков с реализацией этого интерфейса, а добавление сделать через метод get displayObject().


Цитата:
такой подойдет?
Код AS3:
var b:Component = new Component();
var a:IComponent = b;
addChild(b);
Если есть завязка на Component,
придется вместо интерфейса использовать одну из его реализаций(а именно Component) - другую передать не получится, т.е. смысл использования интерфейса теряется.


Последний раз редактировалось expl; 20.11.2011 в 15:47.
Старый 20.11.2011, 15:49
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 4  
Ответить с цитированием
in4core
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Даже бы если и скомпилировалось - это ужасно было бы.
expl честно говоря ни разу не понял трюка. Можешь показать реальную реализацию?
__________________
Марк Tween

Старый 20.11.2011, 16:14
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 5  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Погоди, ты же сам его используешь:
Код AS3:
// кусок кода из Component, который реализует интерфейс IComponent
public function get instance():Sprite { return this };
 
//Код где-то в каком-то классе, который обрабатывает IComponent
public functin doSomething(a:IComponent):void
{
    addChild(a.instance);
    ...
    // работа с другими методами IComponent
}
т.е., код интерфейса так ведь выглядит?
Код AS3:
public interface IComponet
{
    function get instance():Sprite;
    ...
    //другие методы
}

Старый 20.11.2011, 16:24
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 6  
Ответить с цитированием
in4core
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Именно так все и выгялдет. Но не очень мне нравится такая запись все же ( я об этом написал в топике ). Тоесть красивше в таком случае не сделать?
__________________
Марк Tween

Старый 20.11.2011, 16:32
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 7  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Я путей красивше не знаю (по мне и этот сойдет вполне).
Зато знаю извращённее :
Код AS3:
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
}

Старый 20.11.2011, 16:40
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 8  
Ответить с цитированием
in4core
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Ну извращенных методов это понятно )) мы и сами знаем) Лан всем спасиб
__________________
Марк Tween

Старый 20.11.2011, 16:41
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 9  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
ужас((
Цитата:
Т.к. интерфеса IDisplayObject нет, то без приведения типов никак.
А если бы был? addChild() то принимает DisplayObject.
Цитата:
(a as Sprite) - еще хуже чем get instance
Не понял, чем хуже? И почему спрайт, а не ДО?

Добавлено через 23 минуты
Первый принцип SOLID – SPR, принцип единой ответственности (обязанности). Если Вы построили метод таким образом, что он принимает у Вас один тип данных, а работает почему-то с другим – это проблемы не языка, а архитектуры. Метод должен делать одно изменение. Естественно, это в идеале. Но если Вы решили нарушить этот принцип, а потом для избавления от возникших проблем согласны еще и сломать инкапсуляцию и иерархию, передавая детям ссылки на родителей, то тут даже ни о чем хорошем речи нет, не то что об идеальном.
__________________
Reality.getBounds(this);

Старый 20.11.2011, 17:04
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 10  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Сообщение от Wolsh Посмотреть сообщение
ужас((
А если бы был? addChild() то принимает DisplayObject.
addChild() само собой при этом должен был бы принимать IDisplayObject, но это все фантазии, надо радоваться что adobe вобщем достаточно удачно API плеера спроектировала.
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Не понял, чем хуже? И почему спрайт, а не ДО?
Ну не DO, видимо, потому что надо какие-то фишки Sprite использовать, или просто потому что пофиг.

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:33.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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