Изменение области видимости "this" объекта haxe. Возможно?


Можно ли изменить" эту " область объекта, извне, очень похоже на javascript?

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

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

2 2

2 ответа:

Вы можете достичь этого, используя Reflect.callMethod, но вы должны знать, что он не будет типобезопасным во время компиляции. Вот небольшой пример:

class Test
{
    public var a:Int;

    public function new()
    {
        this.a = 0;
    }
}

class Test2
{
    public var a:Int;

    public function new()
    {
        this.a = 0;
    }

    public function increment()
    {
        this.a++;
    }

    static public function main()
    {
        var t = new Test2();
        var t2 = new Test();
        Reflect.callMethod(t2, Reflect.field(t, "increment"), []);

        trace(t2.a); //Traces 1
    }
}

Другим возможным способом было бы использование макросов для перестройки кода для использования какого-либо другого объекта вместо этого. Однако это было бы относительно трудно и бессмысленно. Я не совсем понимаю вашу идею, но, основываясь на том, что я понял из вашего описания, я бы рекомендовал вам изучить встроенные геттеры и сеттеры на компонентах, которые также изменяют контейнер.