Dart中的抽象类:
- 抽象类:Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口
- 抽象类通过abstract关键字来定义
- Dart中的抽象方法不能用abstract声明,Dart中没有方法体的方法我们称为抽象方法
- 如果子类继承抽象类必须得实现里面的抽象方法
- 如果把抽象类当做接口实现的话必须得实现抽象类里面定义的所有属性和方法
- 抽象类不能被实例化,只有继承它的子类可以
extends和implements的区别- 如果要复用抽象类里面的方法,并且要用抽象方法约束子类的话我们就用extends继承抽象类
- 如果只是把抽象类当做标准的话我们就用implements实现抽象类
案列
[!TIP|style:flat|iconVisibility:hidden] 案列:定义一个Animal类要求它的子类必须包含eat方法
abstract class Animal {
eat(); // 抽象方法
run(); // 抽象方法
printInfo() {
print('我是一个抽象类里面的普通方法');
}
}
// 抽象类不能被实例化
class Dog extends Animal {
@override
eat() {
print('小狗在吃骨头');
}
@override
run() {
print('小狗在跑');
}
}
class Cat extends Animal {
@override
eat() {
print('小猫在吃老鼠');
}
@override
run() {
print('小猫在跑');
}
}
main() {
// 抽象类不能被实例化
// var a = new Animal(); // 报错
var a = new Dog();
var c = new Cat();
a.eat();
a.run();
a.printInfo();
c.eat();
c.run();
c.printInfo();
}
Dart中的接口
- 和Java一样,Dart也有接口,但是和Java还是有区别的
- 首先,Dart的接口没有interface关键字定义接口,而是普通类或者抽象类都可以作为接口被实现,同时类和接口的继承使用
implements关键字进行实现。 - 但是Dart的接口有点奇怪,如果实现的类是普通类,会将普通类和抽象类中的属性和方法全部需要覆写一遍。而因为抽象类可以定义抽象方法,普通类不可以,所以一般如果要实现像Java接口那样的方式,一般会使用抽象类。
- 建议使用抽象类定义接口
[!TIP|style:flat|iconVisibility:hidden] 案列:定义一个DB库 支持mysql mssql mongodb
abstract class Db {
String uri;
add(String data);
save();
delete();
}
class Mysql implements Db {
@override
String uri;
Mysql(this.uri);
@override
add(String data) {
print('这是一个mysql的add方法' + data);
}
@override
delete() {
return null;
}
@override
save() {
return null;
}
}
class MsSql implements Db {
@override
String uri;
MsSql(this.uri);
@override
add(String data) {
print('这是一个mssql的add方法' + data);
}
@override
delete() {
return null;
}
@override
save() {
return null;
}
}
main() {
Mysql mysql = new Mysql('xxxx');
mysql.add('哈哈哈');
MsSql mssql = new MsSql('xxxx');
mssql.add('哈哈哈');
}