目录
Dart2中的类都是继承于类Object。Dart2中每一个类都有有一个超类(Object除外),但是一个类的主体可以在多个类层次中使用。
-
类的定义和使用
Dart2中使用关键字class定义类,用.和?.调用类的成员。?.的用法是当对象不为空时,调用成员,为空时,跳过不调用。
class Animal{
String name;
// 构造函数
Animal(String name){
this.name = name;
}
run(){
print("${this.name} is running");
}
}
main(List<String> args) {
// 使用构造函数创建对象
var cat = Animal("cat");
// 也可以用new来创建对象,new从Dart2开始是可选的
var dog = new Animal("dog");
cat.run();
dog.run();
// cat不是null时,name赋予新值
cat?.name = "small cat";
cat.run(); // small cat is running;
Animal nullAnimal;
// nullAnimal是null,如果直接使用nullAnimall.name,会对象为空的报错
nullAnimal?.name = "null";
}
-
获取对象类型
每一个对象都有一个runtimeType的属性,通过这个属性可以获取到该对象的类型(Type的对象)。
class Animal(){}
main(){
// 返回的是一个Type的对象
print(Animal().runtimeType); // Animal
}
-
实例变量
每一个实例变量都有一个隐式的Get方法,如果变量不是final类型的,那么实例变量会有一个隐式的Set方法。
如果一个实例变量有初始值,那么它的值在构造方法生效之前,就已经被赋予。
如果想重写Get和Set方法,可以用关键字get和set实现。
Dart2中以_开头的变量和方法,都是私有的。
// 官网实例代码
class Rectangle {
num left = 10;
num _left_width = 12; // 私有变量
// 定义多个变量
num top, width, height;
Rectangle(this.left, this.top, this.width, this.height);
// 定义两个计算属性: right and bottom.
// 需要注意的是,get和set需要成对出现
// 重写get
num get right => left + width;
// 重写set
set right(num value) => left = value - width;
num get bottom => top + height;
set bottom(num value) => top = value - height;
}
void main() {
var rect = Rectangle(3, 4, 20, 15);
assert(rect.left == 3);
rect.right = 12;
assert(rect.left == -8);
}
-
构造函数
构造函数的定义,可以通过函数名为ClassName和ClassName.identifier(命名的构造函数 Named Constructors)定义。
通过命名的构造函数可以轻松实现多个不同的构造函数。
如果类没有构造函数,那么默认会有一个没有参数的构造函数。
class Animal{
String name;
String color = "yellow";
Animal(String name){
this.name = name;
}
// 上面的构造函数,可以简写为
Animal(this.name);
Animal.createInstance(Map values){
name = values["name"];
}
run(){
print("${this.name} is running");
}
}
main(List<String> args) {
var animal = Animal.createInstance({"name": "dog"});
print(animal.name);
}