本文档基于dart 3.2.3, 于dart > 3.0 有效。本篇起源于大池子面试问题:extends implements、with 有啥区别。关于此问题,我想从class 和 mixin 开始,
1、class、mixin 常用修饰符
abstract
base
final
interface
sealed
mixin
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)
的实现,故此处只实现了方法的重写。文章来源:https://www.toymoban.com/news/detail-809465.html
-
@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
.文章来源地址https://www.toymoban.com/news/detail-809465.html
-
mixin
混入的抽象类,是不能包含构造方法
,时可以包含属性的。 -
mixin
的类,是不能使用多态的,比如上述的Benz
构造出的对象只是Benz
类型。
3、base
TODO
-
1.
base
、interface
或final
之一sealed
,描述对该类进行子类型化的其他库的限制。 -
2.
mixin
到了这里,关于【Flutter】dart class、 mixin和extends、implements、with那些事的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!