本文档基于dart 3.2.3, 于dart > 3.0 有效。本篇起源于大池子面试问题:extends implements、with 有啥区别。关于此问题,我想从class 和 mixin 开始,
abstract
base
final
interface
sealed
mixin
abstract class Veichle {
String egProps;
void moveForward(int meters);
Veichle(this.egProps) {
print("Veichle Constructor $egProps");
}
}
根据我们对OOP
的理解,抽象类中的方法都是抽象方法
,那么dart
抽象类有如下特点
属性
,构造方法
的。egProps
的set
抽象方法,由子类去负责实现。void main(List<String> args) {
Veichle veichle = Passat("帕萨特");
veichle.moveForward(20);
}
abstract class Veichle {
String brand;
void moveForward(int meters);
Veichle(this.brand) {
print("Veichle Constructor $brand");
}
}
class Passat extends Veichle {
Passat(super.egProps) {
print("Passt Constructor ${this.brand}");
}
void moveForward(int meters) {
print("$brand has runed $meters");
}
}
Veichle Constructor 帕萨特
Passt Constructor 帕萨特
帕萨特 has runed 20
class
是可以extends
(继承)抽象类的抽象类
包含抽象方法
(包含构造函数),extends
是要全量实现抽象方法
的。构造方法
, 子类实例对象
构造的过程,是抽象类构造函数,子类构造函数void main(List<String> args) {
Veichle veichleAudi = Audi();
veichleAudi.moveForward(20);
}
class Audi implements Veichle {
String brand = "奥迪";
void moveForward(int meters) {
print("$brand has runed $meters m");
}
}
因为implements
常用于对于接口(interface)
的实现,故此处只实现了方法的重写。
@override
重载了抽象方法(包含属性的get方法)奥迪 has runed 20 m
implements
关键字只@override
(重写)抽象方法(包含属性的set方法)Audi
实例话化程,与抽象类的默认构造函无关。void main(List<String> args) {
Benz benz = Benz("奔驰");
benz.moveForward(20);
}
abstract mixin class NonConstruction {
void moveForward(int meters);
}
class Benz with NonConstruction {
String brand;
Benz(this.brand);
void moveForward(int meters) {
print("不塞车的$brand has runed $meters");
}
}
不塞车的奔驰 has runed 20
值得注意的是,在使用with
关键字时(dart版本在开头已经强调,此处不再赘述),需要声明为mixin
.
mixin
混入的抽象类,是不能包含构造方法
,时可以包含属性的。mixin
的类,是不能使用多态的,比如上述的Benz
构造出的对象只是Benz
类型。base
、interface
或final
之一sealed
,描述对该类进行子类型化的其他库的限制。mixin