Показать сообщение отдельно
Старый 17.01.2011, 00:57
semenyakinVS вне форума Посмотреть профиль Отправить личное сообщение для semenyakinVS Найти все сообщения от semenyakinVS
  № 35  
Ответить с цитированием
semenyakinVS

Регистрация: Mar 2010
Сообщений: 137
Хорошо. Объясняю откуда взялась такая приверженность к множественному наследованию.

Пусть у нас есть большой проект (нам всё равно, какую иерархию он имеет, но он ОЧЕНЬ большой). В определённый момент возникает необходимость сделать графический трасировщик (box2d в тестовом режиме). При этом хочется, чтобы трасировщик оставался в парадигме дисплейных списков (иерархичность тестового отображения, родительские отображения передаются в детей, а главный класс иерархии передаёт всё дерево на сцену).

Выход...

Создаём класс (если бы делал на С++, объявил его виртуальным) с функцией
Код AS3:
graphTrace(parentSprite:Sprite):void
и конструктором, который создаёт этот спрайт (или делает super(), если было наследование ). Все объекты иерархии дополнительно к уже существующим наследованиям и реализациям хотим наследовать от трасировщика, реализуя функцию в каждом по-своему - рисуем в своём тестовом спрайте и передаём его в родительский список тестовых отображений...

Но тут оказывается, что множественного наследования нет! Не выйдет передавать базовый трасировщик как папу-класс. Как папу-интерфейс – можно, но что тогда делать со спрайтом? В интерфейс-то переменные совать нельзя!.. Тащить его по всей структуре, совать в наследников? Засорять private-секцию всех объектов системы?

Ладно, свойство одно, а если их пять? Если десять? Тоже везде заново писать в код наследников?

Ладно, такой класс один!.. А если много?

Например, у нас, в нагрузку ко всему прочему, есть класс, описывающий стандартный объект иерархии. Какой-нибудь CHierarchical? У него есть поле parent. Можно тоже обойтись без класса, но при этом поле снова-таки попадает в наследников… Дурная, надо сказать, наследственность.

Короче, я красивого выхода из подобной ситуации не вижу. Может кто-то подскажет?

Добавлено через 23 минуты
Так. Попробовал реализовать.

Не учёл, что описать вынесенные в наследника свойства надо будет только один раз, потом они будут переходить к наследникам, если описать его как protected. Будет легче, чем думал, но тоже не мёд, если честно.

Но я уже не уверен, что был сто процентов прав...

Добавлено через 1 час 4 минуты
Всё. Переделал... Однако, код мне начинает нравиться, он стал более управляемым!

Но тут как в игре в пинг-понг - повышаешь управляемость, но теряешь в скорости игры. Код стал более громоздким и в нём стали весомее комментарии.

В общем, так как-то:

Код AS1/AS2:
public class Child implements Interface_1, … , Interface_N
	{
		// БЛОК ОПИСАНИЯ НАСЛЕДУЕМЫХ СВОЙСТВ
 
		// эмуляция блока свойств Interface_1// эмуляция блока свойств Interface_N
 
		// БЛОК ОПИСАНИЯ СВОЙСТВ И МЕТОДОВ Child
 
		// свойства Child
 
		public function Child(/*ПАРАМЕТРЫ КОНСТРУКТОРА Child */)
		{
			// ЭМУЛЯЦИЯ КОСТРУКТОРОВ СВОЙСТВ
 
			// эмуляция конструктора Interface_1// эмуляция конструктора Interface_N
 
			// КОНСТРУКТОР Child
 
			// здесь творятся свойства Child
		}
 
 
		// РЕАЛИЗАЦИЯ МЕТОДОВ Child
		. . .
 
 
		// РЕАЛИЗАЦИЯ МЕТОДОВ Interface_1
		. . .
		// РЕАЛИЗАЦИЯ МЕТОДОВ Interface_N
	}


Последний раз редактировалось semenyakinVS; 17.01.2011 в 02:03. Причина: Поправил механические ошибки, структурировал код... И ещё раз структурировал