简述:
上一篇文章中我们详细地介绍了Dart中的面向对象的基础,这一篇文章中我们继续探索Dart中面向对象的重点和难点(继承和mixins). mixins(混合)特性是很多语言中都是没有的。这篇文章主要涉及到Dart中的普通继承、mixins多继承的形式(实际上本质并不是真正意义的多继承)、mixins线性化分析、mixins类型、mixins使用场景等。
一、类的单继承
1、基本介绍
Dart中的单继承和其他语言中类似,都是通过使用 extends
关键字来声明。例如
class Student extends Person {//Student类称为子类或派生类,Person类称为父类或基类或超类。这一点和Java中是一致的。
...
}
2、继承中的构造函数
- 子类中构造函数会默认调用父类中无参构造函数(一般为主构造函数)。
class Person {
String name;
String age;
Person() {
print('person');
}
}
class Student extends Person {
String classRoom;
Student() {
print('Student');
}
}
main(){
var student = Student();//构造Student()时会先调用父类中无参构造函数,再调用子类中无参构造函数
}
输出结果:
person
Student
Process finished with exit code 0
- 若父类中没有默认无参的构造函数,则需要显式调用父类的构造函数(可以是命名构造函数也可以主构造函数或其他), 并且在初始化列表的尾部显式调用父类中构造函数, 也即是类构造函数
:
后面列表的尾部。
class Person {
String name;
int age;
Person(this.name, this.age); //指定了带参数的构造函数为主构造函数,那么父类中就没有默认无参构造函数
//再声明两个命名构造函数
Person.withName(this.name);
Person.withAge(this.age);
}
class Student extends Person {
String classRoom;
Student(String name, int age) : super(name, age) { //显式调用父类主构造函数
print('Student');
}
Student.withName(String name) : super.withName(name) {} //显式调用父类命名构造函数withName
Student.withAge(int age) : super.withAge(age) {} //显式调用父类命名构造函数withAge
}
main() {
var student1 = Student('mikyou', 18);
var student2 = Student.withName('mikyou');
var student3 = Student.withAge(18);
}
- 父类的构造函数在子类构造函数体开始执行的位置调用,如果有初始化列表,初始化列表会在父类构造函数执行之前执行。
class Person {
String name;
int age;
Person(this.name, this.age); //指定了带参数的构造函数为主构造函数,那么父类中就没有默认无参构造函数
}
class Student extends Person {
final String classRoom;
Student(String name, int age, String room) : classRoom = room, super(name, age) {//注意super(name, age)必须位于初始化列表尾部
print('Student');
}
}
main() {
var student = Student('mikyou', 18, '三年级八班');
}
二、基于Mixins的多继承
除了上面和其他语言类似的单继承外,在Dart中还提供了另一继承的机制就是基于Mixins的多继承,但是它不是真正意义上类的多继承,它始终还是只能有一个超类(基类)。
1、为什么需要Mixins?
为什么需要Mixins多继承?它实际上为了解决单继承所带来的问题,我们很多语言中都是采用了单继承+接口多实现的方式。但是这种方式并不能很好适用于所有场景。
假设一下下面场景,我们把车进行分类,然后下面的颜色条表示各种车辆具有的能力。
我们通过上图就可以看到,这些车辆都有一个共同的父类 Vehicle
,然后它又由两个抽象的子类: MotorVehicle
和 NonMotorVehicle
。有些类是具有相同的