AS3 - Абстрактные классы
Как я могу сделать абстрактный класс в AS3 красиво?
Я пробовал это:
public class AnAbstractClass
{
public function toBeImplemented():void
{
throw new NotImplementedError(); // I've created this error
}
}
public class AnConcreteClass extends AnAbstractClass
{
override public function toBeImplemented():void
{
// implementation...
}
}
Но мне это не нравится. И не имеет ошибок времени компиляции.
Ответы
Ответ 1
абстрактные классы не поддерживаются actionscript 3. см. http://joshblog.net/2007/08/19/enforcing-abstract-classes-at-runtime-in-actionscript-3/
приведенная выше ссылка также представляет собой хакерское обходное решение для создания абстрактных классов в as3.
Edit
также см. http://www.kirupa.com/forum/showpost.php?s=a765fcf791afe46c5cf4c26509925cf7&p=1892533&postcount=70
Изменить 2 (В ответ на комментарий)
К сожалению, вы застряли в ошибке времени выполнения. Одним из вариантов было бы иметь защищенный конструктор... кроме as3, это тоже не позволяет. См. http://www.berniecode.com/blog/2007/11/28/proper-private-constructors-for-actionscript-30/ и http://gorillajawn.com/wordpress/2007/05/21/actionscript-3-%E2%80%93-no-private-constructor/.
Вы также можете найти их полезными: http://www.as3dp.com/category/abstract-classes/ и, в частности, http://www.as3dp.com/2009/04/07/design-pattern-principles-for-actionscript-30-the-dependency-inversion-principle/
Ответ 2
package
{
import flash.errors.IllegalOperationError;
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
import flash.utils.getQualifiedSuperclassName;
public class AbstractClass
{
public function AbstractClass()
{
inspectAbstract();
}
private function inspectAbstract():void
{
var className : String = getQualifiedClassName(this);
if (getDefinitionByName(className) == AbstractClass )
{
throw new ArgumentError(
getQualifiedClassName(this) + "Class can not be instantiated.");
}
}
public function foo():void
{
throw new IllegalOperationError("Must override Concreate Class");
}
}
}
package
{
public class ConcreteClass extends AbstractClass
{
public function ConcreteClass()
{
super();
}
override public function foo() : void
{
trace("Implemented");
}
}
}
Ответ 3
В AS3 будут использоваться только интерфейсы, чтобы убедиться, что все функции реализованы во время компиляции.
Я знаю, что это другое, но трюк для примера, такого как выше.
Ответ 4
Пока они не разрешают непубличные конструкторы в actionscript, вам придется полагаться на ошибки времени выполнения для абстрактных классов и синглетов.