【问题标题】:Haxe Property - getters and setters versus @:isVarHaxe 属性 - getter 和 setter 与 @:isVar
【发布时间】:2015-01-13 20:37:44
【问题描述】:

我的问题是关于 haxe 中的属性。 如果我理解正确,如果我做这样的财产 var propertyInt(get, set):Int; 根据 haxe 文档,它并不是真正的变量。但是我可以通过这种方式修改它来使它成为一个变量 @:isVar var propertyInt(get, set):Int;。否则我需要做两种方法:

function get_propertyInt()
    return propertyInt;

function set_properyInt(i)
    return propertyInt = i;

所以我的问题是:我只使用 @:isVar var propertyInt(get, set):Int; 是否重要?例如,我的班级中有超过 5 个属性,正如您可以想象的那样,为每个属性创建此方法可能会给后面带来巨大的痛苦。那么最好的方法是什么?

【问题讨论】:

    标签: haxe


    【解决方案1】:

    以下是documentation 对物理属性(也称为支持字段)所说的话:

    如果一个字段是,则认为它是物理的

    • 变量
    • 读访问或写访问标识符为defaultnull 的属性
    • 具有:isVar 元数据的属性

    因此,您可以设置一个完全由计算值组成的属性。考虑一个只读属性,将矩形的面积作为宽度和高度的函数,或者考虑一个由其他属性支持的属性,只是返回/设置不同单位的宽度和高度。或者,也许您只是想以不同的方式命名您的支持字段,例如 m_widthm_height

    :isVar 在上面列出的属性访问规则等会让编译器认为不需要支持字段的情况下很有帮助。在这种情况下,代码将失败(再次来自文档):

      // This field cannot be accessed because it
      // is not a real variable
      public var x(get, set):Int;
    
      function get_x() {
        return x;
      }
    
      function set_x(x) {
        return this.x = x;
      }
    

    通过添加:isVar,您基本上可以告诉编译器您绝对需要支持字段。对于您的特定情况,另一个选项是使用default,default,在这种情况下,编译器知道需要一个自动支持字段,并且应该根据属性的访问级别(publicprivate)限制访问:

    public var propertyInt(default, default):Int;
    

    在这种情况下,您也可以直接使用变量,因为净效果本质上是相同的:

    public var propertyInt : Int;
    

    【讨论】:

    • 非常感谢您非常满意的回答。我会好好利用它。我仍然有点困惑,我从 c# 跳过去,我慢慢开始了解所有 haxe 功能。非常感谢 ! :)
    • 我还建议在 Haxe 中查找 private 的含义 - 它与 C# 不同:-)
    • 我注意到 private 具有受保护的功能。这是为什么 ?它有点烦人。这种行为有合理的解释吗?我也讨厌缺乏经典的for 循环功能......
    • 开始变成OT了,不过不管怎样……Haxe for() examples for C# programmers
    猜你喜欢
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多