本文档基于dart 3.2.3, 于dart > 3.0 有效。本篇起源于大池子面试问题:extends implements、with 有啥区别。关于此问题,我想从class 和 mixin 开始,
1、class、mixin 常用修饰符
abstractbasefinalinterfacesealedmixin
2、abstract
2.1 抽象类的定义
abstract class Veichle {
String egProps;
void moveForward(int meters);
Veichle(this.egProps) {
print("Veichle Constructor $egProps");
}
}
根据我们对OOP的理解,抽象类中的方法都是抽象方法,那么dart抽象类有如下特点
- 抽象类是可以包含
属性,构造方法的。 - 关于抽象类的属性,JJ的理解是声明了一个
egProps的set抽象方法,由子类去负责实现。
2.2 extends
2.2.1 示例代码
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");
}
}
2.2.2 输出结果
Veichle Constructor 帕萨特
Passt Constructor 帕萨特
帕萨特 has runed 20
2.2.3 总结
class是可以extends(继承)抽象类的- 子类继承如果
抽象类包含抽象方法(包含构造函数),extends是要全量实现抽象方法的。 - 若抽象类包含
构造方法, 子类实例对象构造的过程,是抽象类构造函数,子类构造函数
2.3 implements
2.3.1 事例代码
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方法)
2.3.2 输出结果
奥迪 has runed 20 m
2.3.3 小结
implements关键字只@override(重写)抽象方法(包含属性的set方法)- 因为不存在继承关系,故
Audi实例话化程,与抽象类的默认构造函无关。
2.3 with
2.3.1 事例代码
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");
}
}
2.3.2 输出结果
不塞车的奔驰 has runed 20
2.3.4 小结
值得注意的是,在使用with 关键字时(dart版本在开头已经强调,此处不再赘述),需要声明为mixin.
mixin混入的抽象类,是不能包含构造方法,时可以包含属性的。mixin的类,是不能使用多态的,比如上述的Benz构造出的对象只是Benz类型。
3、base
TODO
- 1.
base、interface或final之一sealed,描述对该类进行子类型化的其他库的限制。 - 2.
mixin
Dart编程:class、mixin、abstract与extends、implements、with的区别详解
本文详细介绍了Dart中class、abstractclass、mixin、extends、implements和with的关键特性,包括抽象类的使用、继承与接口实现,以及mixin如何混入抽象方法和属性。
1445

被折叠的 条评论
为什么被折叠?



