继承
- 使用关键字 extends 继承一个类
- 子类会继承父类可见的属性和方法,不会继承构造方法
- 子类能够复写父类的方法,getter 和 setter
- 单继承,多态性
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Person{ String name; int age;
bool get adult => this.age > 18;
String _birthday;
void run(){ print("Person running..."); } }
|
子类访问父类中的属性和方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Student extends Person{ void study(){ print("Student studying..."); } }
void main(){ Student student = new Student(); student.study();
student.age = 20;
student.run();
print(student.adult); }
|
覆盖父类的方法以及属性
和 java 中类似,使用 @override 表示覆写。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Student extends Perosn{ bool get adult => this.age > 15;
void study(){ print("Student studying..."); }
@override void run() { super.run(); print("student running..."); } }
void main(){ Student student = new Student(); student.age = 16; student.run(); print(student.adult);
}
|
继承中多态的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Student extends Person{ void study(){ print("Student studying..."); }
@override void run() { super.run(); print("student running..."); } }
void main(){ Person person = new Student();
if (person is Student) { person.run(); person.study(); } }
|
继承中的构造方法
- 子类的构造方法默认会调用父类的无名无参构造方法
- 如果父类没有无名无参构造方法,则需要显示调用父类的构造方法
- 在构造方法参数后使用
: super(arg)
显示调用父类构造方法,使用:this(arg)
调用自己的其他构造方法(也可以是带名字的构造方法)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| void main() { var student = new Student("name"); }
class Person{ String name;
Person(this.name); Person.withName(this.name){ print("object"); } }
class Student extends Person{ Student(String name) : super.withName(name); }
|
构造方法执行顺序
- 父类的构造方法在子类构造方法体开始执行的位置调用
- 如果有初始化列表,初始化列表会在父类构造方法之前执行
子类的构造方法初始化列表,必须要在父类初始化列表之前,否则就会报错。
抽象类
使用 abstract class ClassName
创建抽象类
抽象类里面的抽象方法是不实现的(可以有非抽象方法),由子类进行实现,@override
关键词,一般用于来约束子类,制定标准。
同样抽象类不能实例化,里面的属性和实现的方法,只能通过子类去访问,但是可以通过子类的实例赋值给父类的引用实现
继承抽象类是用来约束子类,接口实现抽象类是用来制定标准
接口
- 使用
implements
关键词
- 实现接口,不仅要实现抽象类的属性还要实现抽象类的方法(extends不需要再写一遍属性)
混入(mixin)
Dart中的Mixins通过创建一个新类来实现,该类将mixin的实现层叠在一个超类之上以创建一个新类 ,它不是“在超类中”,而是在超类的“顶部”,因此如何解决查找问题不会产生歧义。— Lasse R. H. Nielsen on StackOverflow.
- 关键词
with
,class A with B, C, D
,后面会覆盖前面
- 可以实现多接口
- 函数命名冲突: 遇到相同功能的函数,最后载入的会覆盖之前的函数定义(如果子类没有重写的话),即最后一个继承的类的方法
参考: