在Dart中特点:
-
不能实例化
-
接口抽象
-
可以默认实现方式
-
可以被别的类实现和继承,抽象类可以直接继承
代码例子说明:
2.1、abstract class 默认实现方法
需要使用 实现类 extends 之后调用,使用implements需要实现默认方法。
main(List args) {
final wp = Woman();
final m = Man(“小明”);
wp.run();
m.run();
}
abstract class Person {
run() {
print(“奔跑”);
}
}
class Man extends Person {
}
class Woman implements Person {
@override
run() {
print(“女神跑步”);
}
}
打印结果:
女神跑步
奔跑
2.2、抽象类被抽象类继承
abstract class Person {
Person(this.name);
final String name;
talk();
run() {
print(“奔跑”);
}
}
abstract class Student extends Person {
Student(String name) : super(name);
int age;
study() {
print(“学习”);
}
hasClass();
}
class Child implements Student {
@override
int age;
@override
hasClass() {
// TODO: implement hasClass
throw UnimplementedError();
}
@override
// TODO: implement name
String get name => throw UnimplementedError();
@override
run() {
// TODO: implement run
throw UnimplementedError();
}
@override
study() {
// TODO: implement study
throw UnimplementedError();
}
@override
talk() {
// TODO: implement talk
throw UnimplementedError();
}
}
总结:abstract class被abstract class继承,继承需要实现父类构造函数。
2.3、abstract class 被Class extends和implements的区别
abstract class Person {
Person(this.name);
final String name;
talk();
run() {
print(“奔跑”);
}
}
class Man extends Person {
Man(String name) : super(name);
@override
talk() {
print(“man talk”);
}
}
class Woman implements Person {
@override
String get name => “女神”;
@override
run() {
print(“女神跑步”);
}
@override
talk() {
print(“女神说话”);
}
}
上面例子,Man 类继承Person 抽象类,Woman 类实现Person抽象类,可以看出区别如下:
-
extends 自动生成abstract 的构造方法,implements则不会
-
extends 不需要实现属性可以直接利用父类, implements需要实现。
-
extends 不需要实现默认方法可以直接利用,implements需要实现。(重要)
-
接口定义方法 extends和implements都需要实现。
Dart的Class特点: 可以当做抽象接口类被实现
代码例子:
class Person {
final String name;
Person(this.name);
talk() {
print(“person talk”);
}
run() {
print(“person run”);
}
}
class Woman implements Person {
@override
// TODO: implement name
String get name => throw UnimplementedError();
@override
run() {
// TODO: implement run
throw UnimplementedError();
}
@override
talk() {
// TODO: implement talk
throw UnimplementedError();
}
}
通过创建一个继承自 Object 且没有构造函数的类,来 实现 一个 Mixin 。 如果 Mixin 不希望作为常规类被使用,使用关键字 mixin 替换 class 。
-
mixin 没有构造函数,不能被实例化
-
可以当做接口使用,class 混入之后需要实现
-
默认方法不需要实现(这个是和abstract 的区别)
-
如果一个类with,方法相同,先执行本体方法,然后按照混入顺序,执行最后mixin方法。
-
可以使用on 指定混入的类类型,如果不是报错。
代码演示:
main(List args) {
final man = Man(“男神”);
man.classes();
man.study();
}
class Person {
final String name;
Person(this.name);
talk() {
print(“person talk”);
}
run() {
print(“person run”);
}
}
class Man extends Person with Student {