如何仅从 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 元数据覆盖。