【问题标题】:How to properly override getters and setters in Haxe如何正确覆盖 Haxe 中的 getter 和 setter
【发布时间】:2016-12-25 07:46:22
【问题描述】:

我对 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;
}

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

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

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

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

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

【问题讨论】:

  • 也许我遗漏了什么?如果父级使用 getter 实现该字段 - openfl.display.DisplayObject 对宽度执行此操作 - 覆盖 getter 确实有效:try.haxe.org/#e4d2c

标签: actionscript-3 setter haxe getter openfl


【解决方案1】:

对不起,是我错过了什么。在 Haxe 中正确定义 getter 和 setter 的方式 现在,在我在这里看到本·莫里斯的例子之后,我明白了这一点。 因此,除了宽度和高度属性之外,我还有一些自定义属性要覆盖,它们给了我“缺少物理场错误” 我只需要为它们指定一个物理字段,然后使用 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 手册可以在 10-15 分钟内阅读,它清楚地告诉你如何执行你所询问的内容。我觉得问这样的问题有点不尊重(尽管我不是反对它的人)。
  • 我以前读过文档,但这有点误导,因为没有关于这些物理字段的真正含义以及为什么设置器需要返回任何值的信息。我是从 AS3 来到 Haxe 的,这个小小的差异一开始让我误入歧途。这就是为什么我在这里创建了这个帖子,评论帮助我理解了这个问题
猜你喜欢
  • 2014-08-05
  • 2018-11-08
  • 1970-01-01
  • 2011-03-11
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
相关资源
最近更新 更多