在 Dart 中,封装是面向对象编程的一个重要特性。它主要是指将数据(变量)和操作这些数据的方法(函数)组合在一个类中,并对外部隐藏数据的具体实现细节,只通过定义好的公共方法来访问和修改数据。这样可以提高代码的安全性和可维护性。
**Dart 不支持 public、private 和 protected 等关键字。Dart 使用 _ (下划线)将属性或方法设为私有。封装发生在库级别,而不是类级别。
私有。getter 和 setter方法来访问和更新私有属性的值。Getter 和 setter 方法用于访问和更新私有属性的值.
class Temperature {
double _celsius;
Temperature.celsius(this._celsius);
// 获取摄氏度
double get celsius => _celsius;
// 设置摄氏度
set celsius(double value) {
_celsius = value;
}
// 获取华氏度
double get fahrenheit => _celsius * 9 / 5 + 32;
// 设置华氏度
set fahrenheit(double value) {
_celsius = (value - 32) * 5 / 9;
}
}
void main() {
var temp = Temperature.celsius(25);
print(temp.fahrenheit); // 77.0
temp.fahrenheit = 77;
print(temp.celsius); // 25.0
}描述:
_celsius,用于存储摄氏度值。Temperature.celsius允许创建一个Temperature对象时直接传入摄氏度值。celsius的getter方法,用于获取当前对象的摄氏度值。celsius的setter方法,允许设置当前对象的摄氏度值。fahrenheit的getter方法,用于将当前对象的摄氏度值转换为华氏度并返回。fahrenheit的setter方法,允许通过设置华氏度值来间接设置摄氏度值。在setter方法内部,华氏度值会被转换为摄氏度,并存储在_celsius字段中。假设一个场景,是给一个商品类实例化的时候,确保商品的价格不能为负数,那么我们就可以使用setter, 来进行数据的校验。
class Product {
String name;
double _price;
Product(this.name, this._price);
// 获取库存数量
double get price => _price;
// 设置库存数量,并进行验证
set price(double value) {
if (value < 0) {
throw Exception('${this.name}不能为负数。');
}
_price = value;
}
}
void main() {
var item = Product("铅笔", 10);
// item.price = 15;
// print(item.price); // 15
// 下面的代码会抛出异常
item.price = -5;
}
}报错:

在Dart语言中,封装是一种重要的面向对象编程特性,它通过将数据(属性)和操作数据的方法(函数)封装在类内部,并控制对这些数据的访问方式,来提高代码的安全性和可维护性。以下是关于Dart中封装、getter和setter的一些关键点:
封装的好处:
Dart中的封装实现:
Getter和Setter的作用:
应用场景:
总结: