我有一个方法(在Haxe中,它需要接受任何具有'width'和'height'属性的对象。我假设我可以使用Interface以某种方式执行此操作,但是出于我的目的,传入的对象不需要实现接口,它只需要是具有width和height属性的any对象。
这不起作用,因为您传入的对象需要实现接口:
Interface IWidthAndHeight{
public var width : Float;
public var height : Float;
}
Class Main{
var o : IWidthAndHeight;
public function setObject( o : IWidthAndHeight ){
this.o = o;
}
}
当前,我正在使用Dynamic,并手动检查属性是否存在,但是有没有更聪明的方法?当前方法:
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 :)
}
任何帮助表示赞赏。谢谢!
您可以在这里使用anonymous structures:
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
参数中的任何类或结构的这些字段,这称为structural subtyping。