Форум 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=176816)

PlutDem 18.03.2012 16:04

Наследование и типы данных, как сделать правильно?
 
Все виды коробок унаследованы от Box и могут содержать в себе вещь наследованную от Item.
Правильно ли объявлять в каждом подклассе Box одну и туже переменную (itemInside), но с разным типом данных?
Код AS3:

class BoxForToys extends Box{
 
                public var itemInside:Toy;       
                public function BoxForToys ():void {
                    itemInside= new Toy();//Toy наследован от Item
        }
 
}

Код AS3:

class BoxForApples extends Box{
 
                public var itemInside:Apple;               
                public function BoxForApples ():void {
                    itemInside= new Apple();//Apple наследован от Item
        }
}


Aquahawk 18.03.2012 16:20

public var itemInside:Toy; переместить в Box

Silicium 18.03.2012 16:21

Во первых, судя по контексту во втором примере должно быть
Код AS3:

itemInside:Apple;

Во вторых вопрос не совсем ясен, что вы имели ввиду? Можете объявить public itemInside:Item в классе Box.

PlutDem 18.03.2012 16:29

Цитата:

Сообщение от Silicium (Сообщение 1069731)
Во первых, судя по контексту во втором примере должно быть
Код AS3:

itemInside:Apple;


Да именно так, исправил.

Цитата:

Сообщение от Silicium (Сообщение 1069731)
Можете объявить public itemInside:Item в классе Box.

Первоначально, так и хотел сделать, но в этом случае в itemInside будет доступны переменные и методы только Item, но ни Toy или Apple. Сейчас в BoxForApples и в BoxForToys объявляются идентичные по логике переменные itemInside , но с разным типом данных. Не уверен, что это правильно.

anmelegov 18.03.2012 16:32

(someItem as Toy).toyMethod() - вот так пробовал обращаться?

alexcon314 18.03.2012 16:42

Используйте интерфейс, в которм объявлены нужные для работы с Item и его наследниками методы.
Можно в Box прописать public var itemInside:IToy; и хранить там ссылки на нужные экземпляры итемов.

Silicium 18.03.2012 17:36

Цитата:

(someItem as Toy).toyMethod()
это верно
Цитата:

Используйте интерфейс
в данном контексте это не нужно

Wolsh 18.03.2012 17:44

В идеале программа вообще не должна оперировать такими сущностями как "игрушка" и "яблоко".
Старайтесь абстрагировать происходящее насколько возможно.
Допустим, у яблока есть метод eat(), а у игрушки – play(). Но может, это стоит абстрагировать до метода use(), который у яблока один, а у игрушки другой? В какой момент "яблоко" становится яблоком? Только когда отображается на экране? Для программы надо знать, что это какой-то фрукт и какого он цвета? Нужна только картинка с яблоком. А по сути и яблоко и игрушка это просто item, у которого есть метод use(), картинка для отображения - image, и текстовое имя name.

HardCoder 18.03.2012 19:30

Это поместить в Box:
Код AS3:

public var itemInside:Item;

Потом:
Код AS3:

public class Apple extends Item{
}

Код AS3:

public class Toy extends Item{
}

Добавлено через 9 минут
Если яблоко и игрушка - это просто предметы, поведенческие свойства которых, не интересны в данном случае, то можно создать класс Item и использовать лишь разные изображения и имена, как писал Wolsh (яблоко/игрушка/мопед).
Но если класс Apple и Toy совсем разные, например: яблоко может гнить со временем, поэтому у него есть метод rot(), чего не скажешь про игрушку, то лучше создать один обобщенный класс Item с общими свойствами и методами для одного и другого, и просто унаследовать яблоко и игрушку от него (как я написал выше).
Все зависит от конкретной ситуации и от того, что автор воплощает в понятия Apple и Toy.

Wolsh 18.03.2012 21:23

Если типов итемов 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
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.