如何在AS3中强制派生类实现方法?

3

我有一个关于OOP(AS3中的面向对象编程)的简单理论问题,不知道该如何搜索:

我需要类似于抽象类的东西,它要求依赖类实现某个接口,就像这样:

Interface ISomething
{
   public function somethingize(otherThing:type):void;
}

abstract public class AbstractSomething implements ISomething
{
   public function AbstractSomething()
   {
        // ...
   }

   public function doSomething():void
   {
       //code here
       // ...
       this.somethingize();
       // ...
   }
}

唯一实现这样的事情的方式是删除"abstract"关键字,并将somethingize移动到SomethingWrapper中(使用抛出"unimplemented exception"的实现),还是有更好的建模方式?

我的看法在这个话题上一直摇摆不定,有时候我认为“只使用语言提供的”(接口)就可以了,有时候又会像你/下面的答案建议的那样去做。坦白地说,我不喜欢默认抛出异常的方法。最终,我认为这取决于你。我仅仅使用接口已经非常满意了。也许无知真的是幸福。 - Sunil D.
此外,使用MVC框架进行依赖注入时,您可以将依赖声明为接口并注入任何实现它的内容,这非常方便。那么“抽象”类也是如此吗?这可能就是我更喜欢接口而不是抽象类的原因。 - Sunil D.
2个回答

3

动作脚本不支持抽象类(不幸的是)。

我认为有一些技巧可以模仿抽象类,但我的方法是在我的抽象类中抛出错误,以阻止它们被直接使用。例如:

public class AbstractSomething implements ISomething
{
    public function AbstractSomething()
    {
        throw new Error("this is an abstract class. override constructor in subclass");
    }

    public function doSomething():void
    {
        throw new Error("this is an abstract class. override doSomething in subclass");
    }
}

0

没有更多有关具体实现的信息,我会更喜欢在这种情况下使用组合而不是继承,尤其是依赖注入。

public interface ISomething {
    function somethingize(thing:*):void;
}

public class SomeWorker {

    private var _something:ISomething;

    public function SomeWorker(something:ISomething) {
       this._something = something;
    }

    public function doSomething():void {

        // work
        this._something.somethingize(obj);
        // more work

    }
}

SomeWorker的子类可以注入正确的ISomething实现来完成他们需要做的工作,或者这个依赖关系可以在其他地方解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接