如何在接口中公开方法而不将其公开给所有类

时间:2009-11-07 04:25:16

标签: flash actionscript-3 oop interface

我有一个问题,我正在使用特定的界面进行很多工作。但是,我有一个特定的方法,我想只能用于特定的一组类(基本上,internal方法)。

interface IThing {
    function thisMethodIsPublic():void;
    function thisMethodShouldOnlyBeVisibleToCertainClasses():void;
}

问题是,无法在界面中添加访问修饰符(即公共,私有,内部) - 至少在ActionScript 3.0中没有。

所以我想知道这里最好的做法是什么?将这个内部方法公开似乎是不好的形式,但我需要它成为接口的一部分,所以我可以保证实现它的类具有这个内部方法。

感谢您的帮助!

5 个答案:

答案 0 :(得分:12)

答案:定义两个接口,并在第二个接口中保留“私有”功能。如果ActionScript支持接口的继承,则将“私有”接口定义为扩展“公共”接口。

答案 1 :(得分:1)

我刚才想到的一个可能的想法是为内部方法定义第二个接口:

interface IThing {
    function thisMethodIsPublic():void;
}

interface IInternalThing {
    function thisMethodShouldOnlyBeVisibleToCertainClasses():void;
}

这样,在使用IThing时,如果没有类型转换,该方法将不可见,但是当您明确键入强制转换为IInternalThing时。这并没有真正解决问题,但它使这种方法更加隐蔽。

答案 2 :(得分:0)

也许使用命名空间代替(或另外)您的界面。只是一个想法。

答案 3 :(得分:0)

很抱歉继续回答我自己的问题但是...另一种可能性,有点疯狂,就是为我想要私有的方法创建一种锁和密钥,类似于SingletonEnforcer常用于AS3。

// IThing.as
interface IThing {
    function thisMethodIsPublic():void;
    function thisMethodShouldOnlyBeVisibleToCertainClasses(key:InternalKey):void;
}

// InternalKey.as
internal class InternalKey {}

这对我来说似乎有点矫枉过正,但我​​测试了它并且它有效! InternalKey外部的类可以看到该方法,但无法调用它。它还保证接口使用有问题的方法,而不必转发到第二个接口。

也可以将第二个接口设为内部接口,而不是使用Internal键。

internal interface IInternalThing extends IThing { 
    function thisMethodShouldOnlyBeVisibleToCertainClasses():void;
}

实际上,这两个都不是我需要的,因为我想让方法暴露在IThing所在的包内的嵌套包中,所以基本上我想在这里使用自定义命名空间但我可以“T。我可能不得不将嵌套包中的类移回到与IThing相同的pacakge中。

答案 4 :(得分:0)

今天我遇到了同样的问题。幸运的是,我有机会创建一个超类而不是接口。而不是使用它:

internal interface IPhysicalObject extends IIDObject {

    function get shape():IShape;

}

我写了这个:

public class PhysicalObject extends IDObject {

    public function PhysicalObject():void {

        ...

    }

    internal function get shape():IShape { ... }

}

当然,只有实现IPhysicalObject接口的类不扩展任何其他类才有可能。我认为这是另一种可能的解决方案。