Показать сообщение отдельно
Старый 18.03.2011, 00:33
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 16  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Касательно addChild и им подобным - я все таки за то, чтобы этого не делать. Вернее, не совсем так, если делать, то в финальных классах, либо классах заточеных под какую-то определенную задачу, у которых будет ограниченный набор наследников, и все они будут опять же финальными. Даже более того, в виду того, что практика нашего мира такова, что получить хорошо, да что там хорошо, хоть как-то спроектированную схему классов к проекту - такого просто никогда не произойдет, я строю наследование по следующему принципу: пишется класс А и класс Б, сравниваются, если у них есть что-то общее, то пишется класс В, в куда это общее выносится, А и Б наследуются от В. Так я хоть немного застрахован от ситуаций, когда "внезапно" нужно переделывать базовый функционал, который я описал не там, где нужно.
Да, еще такой вариант, иногда нужно "немного" переделать базовый метод, если он делает что-то определенно не то. Например, тот же addChild может "своровать" ребенка у другого контейнера - переопределить addChild, чтобы он этого не делал - это как бы даже благородный поступок, по своему А переопределить его и бросить в нем ошибку, как это делает флексовый фреймворк - это "ой беда беда огорчение..."
Но, опять же, в том что касается дисплей объектов - я стараюсь их не трогать. B смысле, просто использовать их как контейнеры для графики, а если мне нужно описать логику - делаю это в классах, метдоы которых принимают эти самые визуальные объекты в качестве аргументов - так проще жить. Особенно в ситуациях когда например, хочется вернуть обратно метод супер-супер класса, и начинаешь ломать голову, как же его так перестроить. Вообще, очень часто получается, что функции, которые не привязаны к контексту (this) класса легче заменяются при необходимости.
Что я имею в виду:
Код AS3:
public class SuperSuper extends Sprite
{
	protected static function doSomething(to:Sprite):void
	{
		to.x = 100;
	}
 
	public function SuperSuper()
	{
		super();
		doSomething(this);
	}
}
Код AS3:
public class Super extends SuperSuper
{
	protected static function doSomething(to:Sprite):void
	{
		to.x = -100;
	}
 
	public function Super()
	{
		super();
		doSomething(this);
	}
}
Код AS3:
public class Orphan extends Super
{
	protected static function doSomething(to:Sprite):void
	{
		to.y = 50;
	}
 
	public function Orphan()
	{
		super();
		// Заметте, что при традиционном подходе к наследованию 
		// это бы выглядело как-то типа super.super.doSomething();
		// что, вобщем не возможно.
		SuperSuper.doSomething(this);
		doSomething(this);
	}
}
Но с другой стороны у такого подхода есть недостатки - с точки зрения AS3 это вообще не наследование, а просто случайное совпадение имен. Такая практика не распростанена и скорее запутает читающего. Кроме того, нам нужно вызывать все функции с одним "лишним" аргументом (опять же именно изза того, что AS3 не считает такой подход наследованием). Очень часто this используется для хранения состояния объекта, например button.enabled и нам удобнее найти свойство напечатав точку после имени объекта, чем сравните:
Код AS3:
static function clickHandler(event:MouseEvent):void
{
	// Предположим, что у класса Button существует методы:
	// static enabled(Button):Boolean
	// static enable(Button):void
	// get enabled():Boolean
	// set enabled(Boolean):void
	var button:Button = event.currentTarget as Button;
	if (enabled(button))
	{
		enable(button);
	}
	// Т.как редактор кода не знает, что enable() связан с SimpleButton - вы будете его долго искать
	if (button.enabled)
	{
		button.enabled = false;
	}
	// Потенциально прийдется писать лишний (возможно ошибочный) код, 
	// если вы задумаете переопределить button.enabled
}
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 18.03.2011 в 12:23.