可见性概述
在 Dart 中,可见性控制了类、方法、变量和其他实体的访问权限。通过合理使用可见性,可以保护数据不被意外修改,同时确保代码模块化和易于维护。
成员可见性
私有成员
私有成员只能在声明它们的库内部访问。在 Dart 中,通过在标识符前添加下划线 _ 来表示私有成员。例如:
class Person {
String _name; // 私有变量
void _printName() { // 私有方法
print(_name);
}
}在上面的例子中,_name 和 _printName 都是私有的,只能在 Person 类所在的库中访问。
公有成员
公有成员可以在任何地方访问。在 Dart 中,默认情况下,如果没有使用下划线前缀,那么成员就是公有的。例如:
class Person {
String name; // 公有变量
void printName() { // 公有方法
print(name);
}
}在这个例子中,name 和 printName 方法都是公有的,可以在任何地方访问。
库可见性
Dart 支持将代码组织成库,并且可以控制库之间的可见性。一个库可以导出其他库中的成员,使得这些成员对其他库可见。例如:
// www.javascriptcn.com code example
// person.dart
library person;
class Person {
String name;
void printName() {
print(name);
}
}
// main.dart
import 'person.dart' show Person;
void main() {
var person = Person();
person.name = "张三";
person.printName();
}在这个例子中,main.dart 导入了 person.dart 库,并只暴露了 Person 类。因此,Person 类是可见的,而 Person 类中的私有成员是不可见的。
库前缀
为了防止命名冲突,可以使用库前缀来引用不同的库。例如:
// www.javascriptcn.com code example
// person.dart
library person;
class Person {
String name;
void printName() {
print(name);
}
}
// address.dart
library address;
class Address {
String street;
String city;
void printAddress() {
print("$street, $city");
}
}
// main.dart
import 'person.dart' as p;
import 'address.dart' as a;
void main() {
var person = p.Person();
person.name = "张三";
var address = a.Address();
address.street = "长安街";
address.city = "北京";
person.printName();
address.printAddress();
}在这个例子中,我们为 person.dart 和 address.dart 分别定义了前缀 p 和 a。这样,即使两个库中有相同名字的类或方法,也可以通过前缀来区分。
私有库成员
虽然库本身不能声明为私有的,但可以将库中的某些成员声明为私有的。例如:
// www.javascriptcn.com code example
// person.dart
library person;
class Person {
String name;
void printName() {
print(name);
}
void _printPrivateMessage() {
print("这是私有方法");
}
}
// main.dart
import 'person.dart';
void main() {
var person = Person();
person.printName(); // 正常调用
// person._printPrivateMessage(); // 错误:无法访问私有方法
}在这个例子中,Person 类中的 _printPrivateMessage 方法是私有的,因此在 main.dart 中无法访问它。
总结
可见性是 Dart 中非常重要的概念,它帮助开发者管理代码结构和数据安全性。通过合理使用私有成员和库前缀,可以有效地组织和保护代码。这不仅有助于提高代码的质量,还能让团队协作更加高效。