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

时间:2019-05-24 09:19:41

标签: haxe

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

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

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

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

希望我解释清楚

1 个答案:

答案 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元数据覆盖。