![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 212
|
Все виды коробок унаследованы от Box и могут содержать в себе вещь наследованную от Item.
Правильно ли объявлять в каждом подклассе Box одну и туже переменную (itemInside), но с разным типом данных? class BoxForToys extends Box{ public var itemInside:Toy; public function BoxForToys ():void { itemInside= new Toy();//Toy наследован от Item } } Последний раз редактировалось PlutDem; 18.03.2012 в 16:21. |
|
|||||
|
Регистрация: Sep 2010
Адрес: Ростов-на-Дону
Сообщений: 369
|
Во первых, судя по контексту во втором примере должно быть
Во вторых вопрос не совсем ясен, что вы имели ввиду? Можете объявить public itemInside:Item в классе Box.
|
|
|||||
|
Регистрация: Feb 2012
Сообщений: 212
|
Цитата:
Первоначально, так и хотел сделать, но в этом случае в itemInside будет доступны переменные и методы только Item, но ни Toy или Apple. Сейчас в BoxForApples и в BoxForToys объявляются идентичные по логике переменные itemInside , но с разным типом данных. Не уверен, что это правильно. |
|
|||||
|
[+4 07.04.12]
[+1 20.01.12] Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
|
(someItem as Toy).toyMethod() - вот так пробовал обращаться?
Последний раз редактировалось anmelegov; 18.03.2012 в 16:46. |
|
|||||
|
listener
|
Используйте интерфейс, в которм объявлены нужные для работы с Item и его наследниками методы.
Можно в Box прописать public var itemInside:IToy; и хранить там ссылки на нужные экземпляры итемов. |
|
|||||
|
Регистрация: Sep 2010
Адрес: Ростов-на-Дону
Сообщений: 369
|
Цитата:
Цитата:
|
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
В идеале программа вообще не должна оперировать такими сущностями как "игрушка" и "яблоко".
Старайтесь абстрагировать происходящее насколько возможно. Допустим, у яблока есть метод eat(), а у игрушки – play(). Но может, это стоит абстрагировать до метода use(), который у яблока один, а у игрушки другой? В какой момент "яблоко" становится яблоком? Только когда отображается на экране? Для программы надо знать, что это какой-то фрукт и какого он цвета? Нужна только картинка с яблоком. А по сути и яблоко и игрушка это просто item, у которого есть метод use(), картинка для отображения - image, и текстовое имя name.
__________________
Reality.getBounds(this); |
|
|||||
|
Это поместить в Box:
Потом:
Добавлено через 9 минут
Если яблоко и игрушка - это просто предметы, поведенческие свойства которых, не интересны в данном случае, то можно создать класс Item и использовать лишь разные изображения и имена, как писал Wolsh (яблоко/игрушка/мопед). Но если класс Apple и Toy совсем разные, например: яблоко может гнить со временем, поэтому у него есть метод rot(), чего не скажешь про игрушку, то лучше создать один обобщенный класс Item с общими свойствами и методами для одного и другого, и просто унаследовать яблоко и игрушку от него (как я написал выше). Все зависит от конкретной ситуации и от того, что автор воплощает в понятия Apple и Toy.
__________________
Я мало чего умею, но зато хорошо умею учиться... Последний раз редактировалось HardCoder; 18.03.2012 в 19:45. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Если типов итемов 3-4, то конечно можно построить баррикаду из свитчей и обращаться с каждым как с яблоком или мопедом. Я к тому, что вы вообще представляете, что это значит, разные типы с разными методами, разным поведением? Каждый из которых буквально запускает разные ветки программы? Стоит ли тут вообще говорить о каком-то единстве? То есть, зачем им вообще наследоваться от Item, если единственное что их объединяет – ящик Карабаса? Но "лежать в ящике" это не их метод, это метод ящика. Так же как у DisplayObject нет метода "добавитьМеняВКонтейнер()", из-за отсутствия которого вся красота интерфейсов обламывается, как только наступает пора добавлять их реализаторов в контейнер.
Я всетаки считаю правильным наследование от суперкласса Item с переопределением реализаций абстрактных методов. Тогда программа сможет оперировать любым наследником Item единым образом. Надо только выделить эти абстракции, при реализации которых и получаются "совершенно разные" Item'ы. Тогда и расширяемость будет на высоте, можно будет добавлять сколько угодно барахла в ящик, не переписывая всю программу.
__________________
Reality.getBounds(this); |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:17. |
|
|
« Предыдущая тема | Следующая тема » |
|
|