作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263
邮箱 :291148484@163.com
本文地址:https://blog.csdn.net/qq_28550263/article/details/131242679
【简介】:本文介绍 Dart 语言中存取器的用法。
目 录
1. 概述
1.1 什么是存取器
存取器(Accessors)是 Dart 语言中一种特殊的方法,它们允许您在访问和修改对象的属性时执行一些操作。存取器主要分为两种:getter(获取器)和 setter(设置器)。
1.2 存取器的类型
从功能上存取器分为“取”和“存”这两个功能,对应有getter和setter这两个类别:
存取器类型 | 描述 |
---|---|
getter | 用于获取对象属性值的方法。 |
setter | 用于设置对象属性值的方法。 |
1.3 为什么需要存取器
我们可以从以下方面来介绍为什么有的时候我们需要用到存储器:
项目 | 描述 |
---|---|
数据封装 | 存取器可以帮助实现数据封装,即将对象的属性和实现细节隐藏起来,只暴露一组公共接口。这样,外部代码无法直接访问和修改对象的内部状态,从而保护了对象的完整性。 |
验证和操作数据 | 存取器允许您在获取或设置属性值时执行一些操作,例如验证数据是否有效、执行计算或触发其他操作。 |
2. Dart 存取器的语法格式
2.1 getter 语法
在一个类中,getter 方法是使用 get 关键字进行声明的,它不接收任何参数:
Type get propertyName { // 返回属性值}
请参考 2.2 setter 语法 小节的示例。
2.2 setter 语法
在一个类中,getter 方法是使用 set 关键字进行声明的,需要接收一个参数,作为设置的值:
set propertyName(Type value) { // 设置属性值}
例如:
import 'package:dio/dio.dart';
import 'package:dio/io.dart';class ApiService {Dio _dio = Dio();int _connectTimeout = 5000; int _receiveTimeout = 3000;bool _useProxy = false; // 默认不使用代理String _proxyUrl = ""; // 代理 URL/// 获取当前是否使用代理bool get useProxy => _useProxy;/// 设置是否使用代理set useProxy(bool value) {_useProxy = value;}/// 获取当前代理 URLString get proxyUrl => _proxyUrl;/// 设置代理 URLset proxyUrl(String value) {_proxyUrl = value;}// ...其它方法}
3. 存取器与访问权限控制
和 dart 中的其它方法一样,存取器也可以定义为共有或者私有访问权限,其中你可以对比 私有字段 和 公共存取器 的区别:
项目 | 描述 |
---|---|
私有字段 | 在 Dart 中,以 _ 开头的字段和方法默认为私有。通过结合私有字段和公共存取器,您可以实现对对象属性的访问权限控制。 |
公共存取器 | 公共存取器是指没有前缀 _ 的 getter 和 setter 方法。通过公共存取器,您可以控制外部代码如何访问和修改对象的属性。 |
4. 存取器进阶
4.1 自动存取器
Dart 支持自动存取器,它允许您为一个属性自动生成 getter 和 setter 方法,而无需显式定义。要使用自动存取器,只需将属性声明为公共(不以 _
开头)即可。
例如:
class Person {// 自动存取器String name;
}void main() {var person = Person();person.name = "Jack"; // 自动调用 setterprint(person.name); // 自动调用 getter
}
4.2 存取器与继承
在继承中,子类可以覆盖父类的存取器。这允许您在子类中修改或扩展父类属性的行为。覆盖存取器时,需要使用 @override
注解,并确保覆盖后的存取器具有与父类相同的签名。
例如:
class Animal {String _name;String get name => _name;set name(String value) {_name = value;}
}class Dog extends Animal {set name(String value) {if (value.isEmpty) {throw ArgumentError("名字不能为空!");}super.name = value;}
}void main() {var dog = Dog();dog.name = "Trump"; // 调用子类的 setterprint(dog.name); // 调用父类的 getter
}
在上面的示例中,Dog
类继承自 Animal
类,并覆盖了父类的 name
setter。当为 Dog
对象设置名称时,将调用子类的 setter 方法,该方法会检查名称是否为空,然后调用父类的 setter 方法。当获取 Dog
对象的名称时,将调用父类的 getter 方法。