如何在Haxe中正确覆盖getter和setter

时间:2016-12-25 07:46:23

标签: actionscript-3 setter haxe getter openfl

我是Haxe的新手,但我在ActionScript 3方面有很多经验。现在我将我的一个框架从AS3移植到openfl,但是我有点卡住了与吸气剂和二传手。 一些框架组件扩展自openfl.display.DisplayObject(准确地说是Sprite),它已经定义了宽度和高度的字段。但是在我的ComponentBase类中,我需要覆盖这些属性。 在AS3中,我这样做:

private var _width:Number = 0;

override public function get width():Number {
    return _width;
}
override public function set width(value:Number):void {
    _width = value;
}

但它在Haxe中并不起作用。如果我这样做

override function get_width():Float {
    return _width;
}

它不会编译因为它想要一个物理场。但我也无法重新定义宽度和高度值,因为它们已在基类中定义。

你可能会问为什么我没有使用这些值' width'和'身高'在基类中定义。这是因为有时我需要访问那些变量,而不是通过getter / setter访问器而是直接访问。例如,我在宽度和高度设置器中调用layout()方法,但我想多次计算它并且只调用layout()一次。

现在我决定使用Java风格的getter和setter来完成工作,但这不是最好的方法。 E.g。

public function setWidth(value:Float):Void {
    _width = value;
}

所以,问题是:是否有可能使Haxe getter和setter使用一些名称与他们应该访问的名称不同的值?

1 个答案:

答案 0 :(得分:4)

对不起,是我错过了什么。在Haxe中正确定义了getter和setter的方式 现在,在我看到Ben Morris的例子后,我明白了。 所以除了宽度和高度属性,我有一些自定义的覆盖,他们给了我“缺少物理场错误” 我只需要为它们指定一个物理字段,然后使用get_ / set_访问器中的任何属性 E.g。

// physical field
public var top(get, set):Float;
var _customTop:Float = 100;

public function get_top():Float {
    return _customTop; // now I can return what ever here
}
public function set_top(value:Float):Float{
    return _customTop = value; 
}

我不知道是谁贬低了我的问题,但这是非常重要的事情,我花了很多时间试图找到解决方案。它真的很容易。 感谢Ben Morris!如果您已将评论作为答案发布,我会接受