2016-12-25 23 views
1

我对Haxe很陌生,但我在ActionScript 3中有很多经验。现在我正在将我的一个框架从AS3移植到openfl,但我是有一种被吸气剂和吸附剂卡住。 一些框架组件从openfl.display.DisplayObject(准确地说是Sprite)扩展而来,它已经定义了宽度和高度的字段。但在我的ComponentBase类中,我需要重写这些属性。 在AS3我做这样的:如何在Haxe中正确地重写getter和setter

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 getter和setter使用一些名称不同于他们应该访问的值?

+1

也许我错过了什么?如果父级使用getter实现该字段 - openfl.display.DisplayObject对宽度执行的操作 - 覆盖getter确实可行:http://try.haxe.org/#e4d2c –

回答

3

对不起,这是我失去了一些东西。在Haxe中正确定义getter和setter的方式 现在,在我看到Ben Morris的例子后,我明白了这一点。 因此,除了宽度和高度属性我有一些自定义的改写,他们给了我“失踪物理场的错误” 我不得不指定一个物理场的他们,然后在使用的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; 
} 

我不知道谁downvoted我的问题,但是这确实是至关重要的事情我已经花了很多时间试图获得解决方案。这真的很容易。 感谢Ben Morris!如果您发表评论为答案,我会接受它

+0

它可能因为haxe手册可读如10-15分钟,它清楚地告诉你如何执行你问到的问题。我觉得提出这样的问题有点不尊重(尽管我不是那种低估它的人)。 – stroncium

+0

我以前已经阅读过文档,但这有点误导,因为没有关于这些物理字段的真实信息,以及制定者为什么需要返回任何值。我从AS3来到Haxe,这种小小的差异开始让我误入歧途。这就是为什么我在这里创建了这个线程,评论帮助我理解了这个问题 – Konstantin