Haxe 属性 - getter 和 setter 与 @:isVar

Haxe Property - getters and setters versus @:isVar

我的问题是关于 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; 有关系吗?例如,我的 class 中有超过 5 个属性,正如您可以想象的那样,为每个 属性 使用此方法可能会在后面带来巨大的痛苦。那么最好的方法是什么?

以下是 documentation 对物理特性(也称为 支持字段 )的看法:

A field is considered to be physical if it is either

  • variable
  • a property with the read-access or write-access identifier being default or null
  • a property with :isVar metadata

因此您可以设置一个完全由计算值组成的 属性。想想一个只读的 属性 给你一个矩形的面积作为宽度和高度的函数,或者想想一个 属性 由其他一些 属性 和 returns/sets 宽度和高度在不同的单位。或者你可能只是想以不同的方式命名你的支持字段,比如 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;