【问题标题】:How to instantiate classes only from inside another class in Haxe如何仅从 Haxe 中的另一个类内部实例化类
【发布时间】:2019-05-24 09:19:41
【问题描述】:

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

我知道在这个例子中 B 可能是一个工厂,我查看了 Haxe 代码食谱中的工厂模式,但它似乎不适合我正在寻找的。​​p>

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

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

希望我解释清楚

【问题讨论】:

    标签: haxe


    【解决方案1】:

    您通常会通过将@: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 中,没有什么是真正私有的。它遵循“程序员最了解”的理念,非常强大。

    另外,您可能希望将A 声明为@:final,这样就没有任何东西可以对其进行子类化,因为子类可以访问 Haxe 中的私有字段。但同样,这可以用 @:hack 元数据覆盖。

    【讨论】:

    • 非常感谢您提供详细且解释清楚的答案,我将在我的代码中尝试此操作。真的非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 2014-01-03
    • 2020-01-01
    • 1970-01-01
    相关资源
    最近更新 更多