我需要防止仅在其他类B处的任何地方实例化类A,然后类B可以返回创建的类A实例,该实例可以在任何其他类中使用。
我知道在这个例子中B可能是一个Factory,我在Haxe代码食谱中查看了factory模式,但它似乎不适合我想要的内容。
在我的示例中,类B正在做一些工作,然后应在类A的实例中返回结果。
没有人应该能够创建类A的实例,因为它是类B执行的工作的结果。任何需要A实例的人都应要求B进行工作并返回结果A实例
希望我能解释清楚
通常,您可以通过将@:allow()元数据与私有构造函数结合使用来实现此目的:
A.hx:
class A {
@:allow(B)
private function new() {}
}
Run Code Online (Sandbox Code Playgroud)
B.hx:
class B {
public static function create():A {
return new A(); // compiles
}
}
Run Code Online (Sandbox Code Playgroud)
尝试在A外部实例化B将导致编译器错误:
class Main {
static function main() {
new A(); // Cannot access private constructor of A
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,仍然可以使用@:access()或@:privateAccess元数据解决此问题-在Haxe中,没有什么是真正的私有的。它遵循“程序员最懂”的哲学,该哲学可能非常强大。
同样,您可能希望声明A为,@:final因此没有什么可以对其进行子类化,因为子类可以访问Haxe中的私有字段。但是同样,可以使用@:hack元数据覆盖它。