如何正确覆盖 Haxe 中的 getter 和 setter
How to properly override getters and setters in Haxe
我是 Haxe 的新手,但我在 ActionScript 3 方面有很多经验。现在我正在将我的一个框架从 AS3 移植到 openfl,但我有点受困于 getter 和 setter .
一些框架组件扩展自 openfl.display.DisplayObject(确切地说是 Sprite),它已经定义了宽度和高度的字段。但是在我的 ComponentBase class 中,我需要覆盖这些属性。
在 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;
}
它不会编译,因为它需要一个物理字段。但我也无法重新定义宽度和高度值,因为它们已经在基 class 中定义。
您可能会问为什么我不使用基 class 中定义的值 'width' 和 'height'。那是因为有时我需要直接访问这些变量而不是通过 getter/setter 访问器。例如,我在宽度和高度设置器中调用了 layout() 方法,但我想多次计算它并只调用一次 layout() 。
现在我决定使用 Java 风格的 getter 和 setter 来完成这项工作,但这不是最好的方法。例如
public function setWidth(value:Float):Void {
_width = value;
}
所以,问题是:是否可以让 Haxe getter 和 setter 使用一些名称与它们应该访问的名称不同的值?
对不起,是我漏了点什么。在 Haxe 中正确定义 getter 和 setter 的方式
现在,在我看到 Ben Morris 的例子之后,我明白了。
所以除了 width 和 height 属性之外,我还有一些自定义的要覆盖,他们给了我 "missing physical field errors"
我只需要为它们指定一个物理字段,然后使用 get_ / set_ 访问器中的任何属性
例如
// 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;
}
我不知道谁对我的问题投了反对票,但这真的很重要,我花了很多时间试图找到解决方案。这真的很容易。
感谢本·莫里斯!如果您发表评论作为回答,我会接受它
我是 Haxe 的新手,但我在 ActionScript 3 方面有很多经验。现在我正在将我的一个框架从 AS3 移植到 openfl,但我有点受困于 getter 和 setter . 一些框架组件扩展自 openfl.display.DisplayObject(确切地说是 Sprite),它已经定义了宽度和高度的字段。但是在我的 ComponentBase class 中,我需要覆盖这些属性。 在 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;
}
它不会编译,因为它需要一个物理字段。但我也无法重新定义宽度和高度值,因为它们已经在基 class 中定义。
您可能会问为什么我不使用基 class 中定义的值 'width' 和 'height'。那是因为有时我需要直接访问这些变量而不是通过 getter/setter 访问器。例如,我在宽度和高度设置器中调用了 layout() 方法,但我想多次计算它并只调用一次 layout() 。
现在我决定使用 Java 风格的 getter 和 setter 来完成这项工作,但这不是最好的方法。例如
public function setWidth(value:Float):Void {
_width = value;
}
所以,问题是:是否可以让 Haxe getter 和 setter 使用一些名称与它们应该访问的名称不同的值?
对不起,是我漏了点什么。在 Haxe 中正确定义 getter 和 setter 的方式 现在,在我看到 Ben Morris 的例子之后,我明白了。 所以除了 width 和 height 属性之外,我还有一些自定义的要覆盖,他们给了我 "missing physical field errors" 我只需要为它们指定一个物理字段,然后使用 get_ / set_ 访问器中的任何属性 例如
// 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;
}
我不知道谁对我的问题投了反对票,但这真的很重要,我花了很多时间试图找到解决方案。这真的很容易。 感谢本·莫里斯!如果您发表评论作为回答,我会接受它