如何仅从Haxe中的另一个类内部实例化类

Mah*_*wad 3 haxe

我需要防止仅在其他类B处的任何地方实例化类A,然后类B可以返回创建的类A实例,该实例可以在任何其他类中使用。

我知道在这个例子中B可能是一个Factory,我在Haxe代码食谱中查看了factory模式,但它似乎不适合我想要的内容。

在我的示例中,类B正在做一些工作,然后应在类A的实例中返回结果。

没有人应该能够创建类A的实例,因为它是类B执行的工作的结果。任何需要A实例的人都应要求B进行工作并返回结果A实例

希望我能解释清楚

Gam*_*a11 5

通常,您可以通过将@: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元数据覆盖它。