AS3对Abstract Class的实现

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的时候就检查是否覆盖了抽象方法)。如果对我这个实现有其它看法的话欢迎评论:)

4 Responses to “AS3对Abstract Class的实现”

  1. says:

    所谓的抽象类,怎么用的还是没看明白。 不知道实际中怎么应用的?

  2. says:

    我举了个简单的例子来解释了一下:)

  3. says:

    //实现类中的2个方法是不是就是对抽象方法的应用。
    public override function mustBeOverriden1(param:String):void
    {
    trace(”from or1 “+param);
    }

    public override function mustBeOverriden2(param:String):void
    {
    trace(”from or2 ” + param);
    }
    //替换所继承的方法。

  4. says:

    应该说不是替换而是实现,可能在as中因为是模拟的所以看上去好像是替换,其实在java中写抽象方法跟写接口中的方法是一样的都没有方法体。
    反正所有具体做的事都是在继承类这里完成,在抽象类中这是一个签名。

Leave a Reply