http://www.zeuslabs.us/2007/08/19/enforcing-abstract-classes-at-runtime-in-actionscript-3/
看了下他关于用AS3实现的Abstract Class,个人感觉这个实现有点麻烦而且有效率的损失。我试着自己写了一个Abstract Class实现:
抽象类:
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
}
}
}
我只是在抽象类中要被抽象的方法中写了个异常抛出语句,意思就是如果你没有覆盖它的话,那么在运行的时候调用这个方法就会抛出异常(并不是像他那样在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中写抽象方法跟写接口中的方法是一样的都没有方法体。
反正所有具体做的事都是在继承类这里完成,在抽象类中这是一个签名。
按理说抽象类是不应该被实体化的,这里“var a:MyAbstractClass = new MyImplementClass();” 为什么不写成 “var a:MyImplementClas = new MyImplementClass();”???谢谢!
这就是多态的魅力,哈哈,它的所有子类都以同一个接口的方式来进行访问,所以可以灵活的更换实现类而不必更改所有的代码