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