如何仅从 Haxe 中的另一个 class 实例化 classes
How to instantiate classes only from inside another class in Haxe
我需要防止 class A 在任何地方实例化,但只能从另一个 class B 实例化,然后 class B 可以 return [=21 的创建实例=] A 可用于任何其他 class.
我知道 B 可以是这个例子中的工厂,我查看了 Haxe 代码说明书中的工厂模式,但它似乎不符合我的要求。
在我的示例中,class B 正在做一些工作,那么 return 结果应该在 class A 的实例中。
没有人能够创建 class A 的实例,因为它是 class B 执行工作的结果。任何需要 A 实例的人都应该让 B 来完成工作,return 结果 A 实例
希望我解释清楚
您通常会通过结合使用 @:allow()
metadata 和私有构造函数来做到这一点:
A.hx
:
class A {
@:allow(B)
private function new() {}
}
B.hx
:
class B {
public static function create():A {
return new A(); // compiles
}
}
尝试在 B
之外实例化 A
将导致编译器错误:
class Main {
static function main() {
new A(); // Cannot access private constructor of A
}
}
请注意,仍然可以通过使用 @:access()
或 @:privateAccess
元数据来解决此问题 - 在 Haxe 中,没有什么是 真正 私有的。它遵循 "the programmer knows best" 的理念,可以非常强大。
此外,您可能希望将 A
声明为 @:final
,这样就无法对其进行子类化,因为子类可以访问 Haxe 中的私有字段。但同样,这可以用 @:hack
元数据覆盖。
我需要防止 class A 在任何地方实例化,但只能从另一个 class B 实例化,然后 class B 可以 return [=21 的创建实例=] A 可用于任何其他 class.
我知道 B 可以是这个例子中的工厂,我查看了 Haxe 代码说明书中的工厂模式,但它似乎不符合我的要求。
在我的示例中,class B 正在做一些工作,那么 return 结果应该在 class A 的实例中。
没有人能够创建 class A 的实例,因为它是 class B 执行工作的结果。任何需要 A 实例的人都应该让 B 来完成工作,return 结果 A 实例
希望我解释清楚
您通常会通过结合使用 @:allow()
metadata 和私有构造函数来做到这一点:
A.hx
:
class A {
@:allow(B)
private function new() {}
}
B.hx
:
class B {
public static function create():A {
return new A(); // compiles
}
}
尝试在 B
之外实例化 A
将导致编译器错误:
class Main {
static function main() {
new A(); // Cannot access private constructor of A
}
}
请注意,仍然可以通过使用 @:access()
或 @:privateAccess
元数据来解决此问题 - 在 Haxe 中,没有什么是 真正 私有的。它遵循 "the programmer knows best" 的理念,可以非常强大。
此外,您可能希望将 A
声明为 @:final
,这样就无法对其进行子类化,因为子类可以访问 Haxe 中的私有字段。但同样,这可以用 @:hack
元数据覆盖。