Как создавать экземпляры классов только из другого класса в Haxe - PullRequest
3 голосов
/ 24 мая 2019

Мне нужно предотвратить создание экземпляра класса A где угодно, но только не из другого класса B, тогда класс B может вернуть созданный экземпляр класса A, который можно использовать в любом другом классе.

Я понимаю, что Bв этом примере это может быть Factory, я посмотрел шаблон фабрики в кулинарной книге кода Haxe, но он не соответствует тому, что я ищу.

В моем примере класс B выполняет некоторую работу, затем должен вернутьпривести к экземпляру класса A.

никто не сможет создать экземпляр класса A, потому что это результат работы, которую выполняет класс B.всем, кому нужен экземпляр A, следует попросить B выполнить работу и вернуть полученный экземпляр A

надеюсь, я объяснил это ясно

1 Ответ

5 голосов
/ 24 мая 2019

Обычно вы делаете это, используя @:allow() метаданные в сочетании с приватным конструктором:

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.

...