Dart 中抽象类概述
- 抽象类使用 abstract 表示,不能直接被实例化
- 抽象方法不用 abstract 修饰,无实现
- 抽象类可以没有抽象方法
- 有抽象方法的类一定得定义为抽象类
抽象类中的方法写法
abstract class Person{
// 定义属性
String name = "人"; // 可以赋初始值
int age;
// 定义方法
run(){}
// 抽象方法
exec();
}
Dart 中接口概述
- 类和接口是统一的,类就是接口
- 每个类都隐式的定义个了一个包含所有实例成员的接口(说人话:也是在说明类就是接口)
- 如果是复用已有的类的实现,使用继承(extends)
- 如果只是使用已有类的外在行为,使用接口(implements)
类就是接口,实现 接口 就需要覆写 接口中所有的成员(属性以及方法)
抽象类作为接口来使用
Dart 中的多继承 Mixins
- Mixins 类似于多继承,是在多类继承中重用一个类代码的方式
- 作为 Mixins 的类不能有显示声明构造方法
- 作为 Mixin 的类只能继承自 Object
使用 with 关键字来实现多继承,必须要先有 extends 然后才能使用 with 实现 mixins 操作。
void main(List<String> args) {
var d = new D();
d.a();
d.b();
}
class A {
void a() {
print("A.a().....");
}
}
class B {
void b() {
print("B.b().....");
}
}
class C {
void c() {
print("C.c().....");
}
}
// 这里使用 mixins 来实现多继承,使用 with 关键字
// error: class D with A, B, C{},必须要现有 extends
class D extends A with B, C{}
mixins 操作的顺序问题
下面我们修改代码:
- 让 B 类中包含有 A 类的方法
- 让 C 类中包含有 B 类的方法
class A {
void a() {
print("A.a().....");
}
}
class B {
void a() {
print("B.a().....");
}
void b() {
print("B.b().....");
}
}
class C {
void a() {
print("C.a().....");
}
void b() {
print("C.b().....");
}
void c() {
print("C.c().....");
}
}
class D extends A with B, C{}
void main(List<String> args) {
var d = new D();
d.a(); // C.a().....
}
由于,继承的顺序中,C 是在最后,所以就会去调用 C 中的 a 方法。修改这个继承顺序,那么就会看最后的那个类,再去执行最后那个类的方法。
Mixins 操作的限制
作为 Mixins 的类,不能有显示声明的构造方法
图为报错提示:
作为 Mixins 的类,不能有继承与其他的类
图为报错提示:
特殊的 Mixins 写法
abstract class Engine{
void work();
}
class OilEngine implements Engine{
@override
void work() {
print("OliEngine working....");
}
}
class ElectricEngine implements Engine{
@override
void work() {
print("ElectricEngine working....");
}
}
class Tyre{
String name;
void run(){}
}
// class Car extends Tyre with ElectricEngine{} 简化写法如下
class Car = Tyre with ElectricEngine;
class Bus = Tyre with OilEngine;