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

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

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

Регистрация: Feb 2012
Сообщений: 212
По умолчанию Наследование и типы данных, как сделать правильно?

Все виды коробок унаследованы от 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
	}
}


Последний раз редактировалось PlutDem; 18.03.2012 в 16:21.
Старый 18.03.2012, 16:20
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 2  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
public var itemInside:Toy; переместить в Box
__________________
:)

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

Регистрация: Sep 2010
Адрес: Ростов-на-Дону
Сообщений: 369
Во первых, судя по контексту во втором примере должно быть
Код AS3:
itemInside:Apple;
Во вторых вопрос не совсем ясен, что вы имели ввиду? Можете объявить public itemInside:Item в классе Box.

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

Регистрация: Feb 2012
Сообщений: 212
Цитата:
Сообщение от Silicium Посмотреть сообщение
Во первых, судя по контексту во втором примере должно быть
Код AS3:
itemInside:Apple;
Да именно так, исправил.

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

Старый 18.03.2012, 16:32
anmelegov вне форума Посмотреть профиль Отправить личное сообщение для anmelegov Найти все сообщения от anmelegov
  № 5  
Ответить с цитированием
anmelegov
[+4 07.04.12]
[+1 20.01.12]

Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
(someItem as Toy).toyMethod() - вот так пробовал обращаться?


Последний раз редактировалось anmelegov; 18.03.2012 в 16:46.
Старый 18.03.2012, 16:42
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 6  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Используйте интерфейс, в которм объявлены нужные для работы с Item и его наследниками методы.
Можно в Box прописать public var itemInside:IToy; и хранить там ссылки на нужные экземпляры итемов.

Старый 18.03.2012, 17:36
Silicium вне форума Посмотреть профиль Отправить личное сообщение для Silicium Найти все сообщения от Silicium
  № 7  
Ответить с цитированием
Silicium
 
Аватар для Silicium

Регистрация: Sep 2010
Адрес: Ростов-на-Дону
Сообщений: 369
Цитата:
(someItem as Toy).toyMethod()
это верно
Цитата:
Используйте интерфейс
в данном контексте это не нужно

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
В идеале программа вообще не должна оперировать такими сущностями как "игрушка" и "яблоко".
Старайтесь абстрагировать происходящее насколько возможно.
Допустим, у яблока есть метод eat(), а у игрушки – play(). Но может, это стоит абстрагировать до метода use(), который у яблока один, а у игрушки другой? В какой момент "яблоко" становится яблоком? Только когда отображается на экране? Для программы надо знать, что это какой-то фрукт и какого он цвета? Нужна только картинка с яблоком. А по сути и яблоко и игрушка это просто item, у которого есть метод use(), картинка для отображения - image, и текстовое имя name.
__________________
Reality.getBounds(this);

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

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Это поместить в 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.
__________________
Я мало чего умею, но зато хорошо умею учиться...


Последний раз редактировалось HardCoder; 18.03.2012 в 19:45.
Старый 18.03.2012, 21:23
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 10  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Если типов итемов 3-4, то конечно можно построить баррикаду из свитчей и обращаться с каждым как с яблоком или мопедом. Я к тому, что вы вообще представляете, что это значит, разные типы с разными методами, разным поведением? Каждый из которых буквально запускает разные ветки программы? Стоит ли тут вообще говорить о каком-то единстве? То есть, зачем им вообще наследоваться от Item, если единственное что их объединяет – ящик Карабаса? Но "лежать в ящике" это не их метод, это метод ящика. Так же как у DisplayObject нет метода "добавитьМеняВКонтейнер()", из-за отсутствия которого вся красота интерфейсов обламывается, как только наступает пора добавлять их реализаторов в контейнер.
Я всетаки считаю правильным наследование от суперкласса Item с переопределением реализаций абстрактных методов. Тогда программа сможет оперировать любым наследником Item единым образом. Надо только выделить эти абстракции, при реализации которых и получаются "совершенно разные" Item'ы. Тогда и расширяемость будет на высоте, можно будет добавлять сколько угодно барахла в ящик, не переписывая всю программу.
__________________
Reality.getBounds(this);

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

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

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


 


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


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