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

康斯坦丁

我对Haxe还是很陌生,但是我在ActionScript 3中有很多经验。现在,我正在将我的一个框架从AS3移植到openfl,但是我有点受getter和setter的困扰。一些框架组件从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”和“ height”。这是因为有时我需要访问的变量不是通过getter / setter访问器,而是直接访问。例如,我在宽度和高度设置器内部调用了layout()方法,但是我想对其进行多次计算,并且只调用一次layout()。

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

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

因此,问题是:是否可以使Haxe获取器和设置器使用某些名称与应使用的名称不同的值?

康斯坦丁

抱歉,是我丢失了一些东西。在Haxe中正确定义getter和setter的方式现在,在这里看到Ben Morris的示例后,我明白了。因此,除了width和height属性,我还有一些自定义属性要覆盖,它们给了我“缺少物理字段错误”,我只需要为其指定一个物理字段,然后在get_ / set_ accessors中使用任何属性即可,例如

// 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; 
}

我不知道是谁拒绝了我的问题,但这确实是至关重要的事情,我已经花了很多时间尝试寻求解决方案。这真的很容易。感谢本·莫里斯!如果您发表评论作为答案,我会接受

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章