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

rlcwz9us  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(108)

我正在与Dart中的getter和setter的概念作斗争,我读得越多,就越不能抓住潜在的目的。下面是一个例子:

main() {
    Car car = new Car();
    car.doors = 44;
    print(car.doors);  // 44
}
class Car {
    int doors = 4;
}

字符串
后来,我决定将“doors”设为私有变量,所以我做了以下操作:

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;
}


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

yqkkidmi

yqkkidmi1#

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;
}

字符串
此外,你还可以在getter或setter中添加一些在隐式getter或setter中没有的额外逻辑:

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

9njqaruj

9njqaruj2#

getter和setter函数允许我们让类 * 看起来 * 有一个属性,而不需要显式声明属性(在您的例子中是_doors)。属性值可以从其他属性计算。
getter和setter允许我们在属性为get或set时执行任意代码。
省略setter使属性不可变。
抽象类可以声明没有主体的getter和setter作为必需的类接口的一部分。

相关问题