Haxe: аргумент функции, соответствующий интерфейсу - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть метод (в Haxe), который должен принимать любой объект, который имеет свойства 'width' и 'height'. Я предполагаю, что я могу сделать это как-то с помощью интерфейса, но для моих целей передаваемый объект не должен реализовывать интерфейс, он просто должен быть любым объектом с шириной и высотой свойство.

Это не работает, поскольку объект, который вы передаете, должен реализовать интерфейс:

Interface IWidthAndHeight{
    public var width : Float;
    public var height : Float;
}

Class Main{

    var o : IWidthAndHeight;

    public function setObject( o : IWidthAndHeight ){
        this.o = o;
    }

}

В настоящее время я использую Dynami c и вручную проверяю, существуют ли свойства, но есть ли умнее? Текущий метод:

Class Main{

    var o : Dynamic;

    public function setObject( o : Dynamic ){
        if (propertiesExist(o,['width','height'])){
            this.o = o;
        }
    }

    // Note: propertiesExist is my own method. Just assume it works :)
}

Любая помощь приветствуется. Спасибо!

1 Ответ

1 голос
/ 28 апреля 2020

Вы можете использовать анонимные структуры здесь:

typedef WidthAndHeight = {
    width:Float,
    height:Float
}
class Main {
    var o:WidthAndHeight;
    public function setObject(o:WidthAndHeight) {
        this.o = o;
    }
}

Это просто альтернатива var o:{width:Float, height:Float}; с typedef. Любой класс или структура в аргументе setObject будут проверены для этих полей во время компиляции, это называется структурный подтип .

...