http://www.zeuslabs.us/2007/08/19/enforcing-abstract-classes-at-runtime-in-actionscript-3/
看了下他关于用AS3实现的Abstract Class,个人感觉这个实现有点麻烦而且有效率的损失。我试着自己写了一个Abstract Class实现:
抽象类:
[code:php]
package jeff.abstract
{
import flash.errors.IllegalOperationError;
public class MyAbstractClass
{
public function MyAbstractClass(self:MyAbstractClass)
{
if(self != this)
{
throw new IllegalOperationError("Abstract class did not receive reference to self. MyAbstractClass cannot be instantiated directly.");
}
}
public function mustBeOverriden1(param:String):void
{
throw new IllegalOperationError("abstract function must be overriden");
}
public function mustBeOverriden2(param:String):void
{
throw new IllegalOperationError("abstract function must be overriden");
}
}
}
实现类:
package jeff.abstract
{
public class MyImplementClass extends MyAbstractClass
{
public function MyImplementClass()
{
super(this);
}
public override function mustBeOverriden1(param:String):void
{
trace("From or1 "+param);
}
public override function mustBeOverriden2(param:String):void
{
trace("From or2 " + param);
}
}
}
未实现抽象类中的方法的实现类:
package jeff.abstract
{
public class NotImplementAbstract extends MyAbstractClass
{
public function NotImplementAbstract()
{
super(this);
}
}
}
运行类:
package {
import flash.display.Sprite;
import jeff.abstract.MyAbstractClass;
import jeff.abstract.MyImplementClass;
import jeff.abstract.NoImplementAbstract;
public class AbstractTest extends Sprite
{
public function AbstractTest()
{
var a:MyAbstractClass = new MyImplementClass();
a.mustBeOverriden1("hi");
a.mustBeOverriden2("world");
// output: From or1 hi
From or2 world
var b:MyAbstractClass = new NotImplementAbstract();
b.mustBeOverriden1("hi");
b.mustBeOverriden2("world");
// throw exceptions
}
}
}
[/code]
我只是在抽象类中要被抽象的方法中写了个异常抛出语句,意思就是如果你没有覆盖它的话,那么在运行的时候调用这个方法就会抛出异常(并不是像他那样在new的时候就检查是否覆盖了抽象方法)。如果对我这个实现有其它看法的话欢迎评论:)
所谓的抽象类,怎么用的还是没看明白。 不知道实际中怎么应用的?
我举了个简单的例子来解释了一下:)
//实现类中的2个方法是不是就是对抽象方法的应用。
public override function mustBeOverriden1(param:String):void
{
trace(”from or1 “+param);
}
public override function mustBeOverriden2(param:String):void
{
trace(”from or2 ” + param);
}
//替换所继承的方法。
应该说不是替换而是实现,可能在as中因为是模拟的所以看上去好像是替换,其实在java中写抽象方法跟写接口中的方法是一样的都没有方法体。
反正所有具体做的事都是在继承类这里完成,在抽象类中这是一个签名。