我在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)
getter 和 setter 函数允许我们使类看起来有一个属性,而无需声明显式属性(_doors
在您的情况下)。可以从其他属性计算属性值。
getter 和 setter 允许我们在属性为 get 或 set 时执行任意代码。
省略 setter 会使属性不可变。
抽象类可以将没有主体的 getter 和 setter 声明为所需类接口的一部分。