![]() |
Наследование и типы данных, как сделать правильно?
Все виды коробок унаследованы от Box и могут содержать в себе вещь наследованную от Item.
Правильно ли объявлять в каждом подклассе Box одну и туже переменную (itemInside), но с разным типом данных? Код AS3:
Код AS3:
|
public var itemInside:Toy; переместить в Box
|
Во первых, судя по контексту во втором примере должно быть
Код AS3:
|
Цитата:
Цитата:
|
(someItem as Toy).toyMethod() - вот так пробовал обращаться?
|
Используйте интерфейс, в которм объявлены нужные для работы с Item и его наследниками методы.
Можно в Box прописать public var itemInside:IToy; и хранить там ссылки на нужные экземпляры итемов. |
Цитата:
Цитата:
|
В идеале программа вообще не должна оперировать такими сущностями как "игрушка" и "яблоко".
Старайтесь абстрагировать происходящее насколько возможно. Допустим, у яблока есть метод eat(), а у игрушки – play(). Но может, это стоит абстрагировать до метода use(), который у яблока один, а у игрушки другой? В какой момент "яблоко" становится яблоком? Только когда отображается на экране? Для программы надо знать, что это какой-то фрукт и какого он цвета? Нужна только картинка с яблоком. А по сути и яблоко и игрушка это просто item, у которого есть метод use(), картинка для отображения - image, и текстовое имя name. |
Это поместить в Box:
Код AS3:
Код AS3:
Код AS3:
Если яблоко и игрушка - это просто предметы, поведенческие свойства которых, не интересны в данном случае, то можно создать класс Item и использовать лишь разные изображения и имена, как писал Wolsh (яблоко/игрушка/мопед). Но если класс Apple и Toy совсем разные, например: яблоко может гнить со временем, поэтому у него есть метод rot(), чего не скажешь про игрушку, то лучше создать один обобщенный класс Item с общими свойствами и методами для одного и другого, и просто унаследовать яблоко и игрушку от него (как я написал выше). Все зависит от конкретной ситуации и от того, что автор воплощает в понятия Apple и Toy. |
Если типов итемов 3-4, то конечно можно построить баррикаду из свитчей и обращаться с каждым как с яблоком или мопедом. Я к тому, что вы вообще представляете, что это значит, разные типы с разными методами, разным поведением? Каждый из которых буквально запускает разные ветки программы? Стоит ли тут вообще говорить о каком-то единстве? То есть, зачем им вообще наследоваться от Item, если единственное что их объединяет – ящик Карабаса? Но "лежать в ящике" это не их метод, это метод ящика. Так же как у DisplayObject нет метода "добавитьМеняВКонтейнер()", из-за отсутствия которого вся красота интерфейсов обламывается, как только наступает пора добавлять их реализаторов в контейнер.
Я всетаки считаю правильным наследование от суперкласса Item с переопределением реализаций абстрактных методов. Тогда программа сможет оперировать любым наследником Item единым образом. Надо только выделить эти абстракции, при реализации которых и получаются "совершенно разные" Item'ы. Тогда и расширяемость будет на высоте, можно будет добавлять сколько угодно барахла в ящик, не переписывая всю программу. |
| Часовой пояс GMT +4, время: 02:03. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.