Показать сообщение отдельно
Старый 17.01.2011, 21:10
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 4  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
Никто не мешает наследовать отдельно включаемый класс, если я правильно понял проблему.. Т.е. например:
Иерархия для включения:
Код AS3:
public interface ITrace 
{
	function traceObject():void;
}
 
public class BaseTrace implements ITrace
{
 
	public function BaseTrace() 
	{
 
	}
 
	/* INTERFACE ITrace */
 
	public function traceObject():void 
	{
		trace("trace:");
	}
 
}
 
public class CircleTrace extends BaseTrace
{
 
	public function CircleTrace() 
	{
 
	}
	override public function traceObject():void 
	{
		super.traceObject();
		trace("-circle");
	}
 
}
 
 
public class BoxTrace extends BaseTrace
{
 
	public function BoxTrace() 
	{
 
	}
	override public function traceObject():void 
	{
		super.traceObject();
		trace("-box")
	}
 
}
 
public class Box2Trace extends BoxTrace
{
 
	public function Box2Trace() 
	{
 
	}
	override public function traceObject():void 
	{
		super.traceObject();
		trace("-box2");
	}
 
}
Собственно наша иерархия:
Код AS3:
public class Shape 
{
 
	public function Shape() 
	{
 
	}
	public function draw():void
	{
		trace("draw void");
	}
 
}
 
public class Circle extends Shape implements ITrace
{
 
	public function Circle() 
	{
 
	}
	override public function draw():void 
	{
		super.draw();
	}
 
	/* INTERFACE ITrace */
	private var _implTrace:CircleTrace = new CircleTrace();
	public function traceObject():void 
	{
		_implTrace.traceObject();
	}
 
}
 
public class Box extends Shape implements ITrace
{
 
	public function Box() 
	{
		_implTrace = createTrace();
	}
	override public function draw():void 
	{
		trace("draw box");
	}
 
	private var _implTrace:ITrace;
 
	protected function createTrace():ITrace
	{
		return new BoxTrace();
	}
 
	/* INTERFACE ITrace */
 
	public function traceObject():void 
	{
		_implTrace.traceObject();
	}
 
}
 
public class Box2 extends Box
{
 
	public function Box2() 
	{
 
	}
	override protected function createTrace():ITrace 
	{
		return new Box2Trace();
	}
 
}
Реализовать можно все что угодно... и при этом вся прелесть наследования остается..

Добавлено через 3 минуты
Опять же, при таком подходе можно использовать один и тот же Trace объект, для разных наследников Shape...
К примеру наш Box2Trace вполне может подходить для какого нибудь Box3 наследуемого от Shape, а не Box2. И получится вполне себе повторное использование кода, что при множественном наследовании невозможно...

Пример конечно надуманный, но и проблема, по моему тоже
__________________
Искренне Ваш, Джек.