getter和setter如何在Dart中更改属性?

rch*_*hkm 24 dart

我在Dart中苦苦寻求getter和setter的概念,我读的越多,我就无法理解其根本目的.以下面的代码为例:

main() {
    Car car = new Car();
    car.doors = 44;
    print(car.doors);  // 44
}
class Car {
    int doors = 4;
}
Run Code Online (Sandbox Code Playgroud)

后来,我决定将"门"变成一个私有变量,所以我做了以下几点:

main() {
    Car car = new Car();
    car.doors = 44;
    print(car.doors);  // 44
}
class Car {
    int _doors = 4;
    int get doors => _doors;
    set doors(int numberOfDoors) => _doors = numberOfDoors;
}
Run Code Online (Sandbox Code Playgroud)

根据代码,_doors现在是一个私有变量,因此我无法在main()中访问它.然而,通过操纵doors,我可以_doors通过使其成为私有变量来间接地改变我认为我想要首先防止的值.那么,如果您仍然可以间接操纵它,那么将以前的公共变量变为私有变量的目的是什么?而且,getter和setter如何改变这些变量的属性呢?我试图理解基本概念,因为没有它,我不明白如何或为什么使用getter和setter.

Pix*_*ant 52

Dart中的实例变量具有隐式getter和setter.因此,对于您的示例代码,它将以完全相同的方式运行,因为您所做的就是从隐式getter和setter更改为显式getter和setter.

显式getter和setter的值是,如果你不想要,你不需要定义它们.例如,我们可以将您的示例更改为仅定义getter:

main() {
    Car car = new Car();
    print(car.doors);  // 4
    car.doors = 6; // Won't work since no doors setter is defined
}

class Car {
    int _doors = 4;
    int get doors => _doors;
}
Run Code Online (Sandbox Code Playgroud)

此外,您还可以在getter或setter中添加额外的逻辑,而不是在隐式getter或setter中:

class Car {
    int _doors = 4;
    int get doors => _doors;
    set doors(int numberOfDoors) {
      if(numberOfDoors >= 2 && numberOfDoors <= 6) {
        _doors = numberOfDoors;
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为关于附加逻辑的最后一点是关键部分。通过将变量设为私有,您需要所有更改都通过设置器,这将强制运行额外的逻辑(可以考虑不将设置器定义为阻止所有设置的特定类型的设置器逻辑的情况)。 (2认同)
  • 总之,getter和setter仅用于覆盖默认的getter和setter,从而提供更大的灵活性.这可能有用的情况:1)当您希望实例变量具有不同的getter(重新分配变量),setter(赋值)或两者时.2)如果要将逻辑添加到赋值中,setter可以执行此操作.在我的例子中,我应该删除"set"行.这将重新分配门等于_doors的价值(而不是破坏向后兼容性),但由于门不能改变,_门不会受到影响,使_门真正私密.谢谢. (2认同)

Arg*_*tus 7

getter 和 setter 函数允许我们使类看起来有一个属性,而无需声明显式属性(_doors在您的情况下)。可以从其他属性计算属性值。

getter 和 setter 允许我们在属性为 get 或 set 时执行任意代码。

省略 setter 会使属性不可变。

抽象类可以将没有主体的 getter 和 setter 声明为所需类接口的一部分。