我有一个问题,我正在使用特定的界面进行很多工作。但是,我有一个特定的方法,我想只能用于特定的一组类(基本上,internal
方法)。
interface IThing {
function thisMethodIsPublic():void;
function thisMethodShouldOnlyBeVisibleToCertainClasses():void;
}
问题是,无法在界面中添加访问修饰符(即公共,私有,内部) - 至少在ActionScript 3.0中没有。
所以我想知道这里最好的做法是什么?将这个内部方法公开似乎是不好的形式,但我需要它成为接口的一部分,所以我可以保证实现它的类具有这个内部方法。
感谢您的帮助!
答案 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接口的类不扩展任何其他类才有可能。我认为这是另一种可能的解决方案。