一、Dart中的抽象类
Dart中抽象类: Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。
1、抽象类通过abstract 关键字来定义
2、Dart中的抽象方法不能用abstract声明,Dart中没有方法体的方法我们称为抽象方法。
3、如果子类继承抽象类,必须得实现里面的抽象方法
4、如果把抽象类当做接口实现的话必须得实现抽象类里面定义的所有属性和方法。
5、抽象类不能被实例化,只有继承它的子类可以
extends抽象类 和 implements的区别:
1、如果要复用抽象类里面的方法,并且要用抽象方法约束自类的话我们就用extends继承抽象类
2、如果只是把抽象类当做标准的话我们就用implements实现抽象类
案例:定义一个Animal 类要求它的子类必须包含eat、run方法
1abstract class Animal{ 2 eat(); //抽象方法 3 run(); //抽象方法 4 printInfo(){ 5 print('我是一个抽象类里面的普通方法'); 6 } 7} 8 9//继承的子类必须包含eat和run方法 10class Dog extends Animal{ //鼠标放在Dog上,点击快速修复 11 @override 12 eat() { 13 print('小狗在吃骨头'); 14 } 15 16 @override 17 run() { 18 // TODO: implement run 19 print('小狗在跑'); 20 } 21} 22class Cat extends Animal{ 23 @override 24 eat() { 25 // TODO: implement eat 26 print('小猫在吃老鼠'); 27 } 28 29 @override 30 run() { 31 // TODO: implement run 32 print('小猫在跑'); 33 } 34 35} 36 37main(){ 38 39 Dog d=new Dog(); 40 d.eat(); 41 d.printInfo(); 42 43 Cat c=new Cat(); 44 c.eat(); 45 c.printInfo(); 46 47 48 // Animal a=new Animal(); //抽象类没法直接被实例化 49 50} 51
二、Datr中的多态
-
允许将子类类型的指针赋值给父类类型的指针, 同一个函数调用会有不同的执行效果 。
-
子类的实例赋值给父类的引用。
-
多态就是父类定义一个方法不去实现,让继承他的子类去实现,每个子类有不同的表现。
1abstract class Animal{ 2 eat(); //抽象方法 3} 4 5class Dog extends Animal{ 6 @override 7 eat() { 8 print('小狗在吃骨头'); 9 } 10 run(){ 11 print('run'); 12 } 13} 14class Cat extends Animal{ 15 @override 16 eat() { 17 print('小猫在吃老鼠'); 18 } 19 run(){ 20 print('run'); 21 } 22} 23 24main(){ 25 26 // Dog d=new Dog(); 27 // d.eat(); 28 // d.run(); 29 30 31 // Cat c=new Cat(); 32 // c.eat(); 33 34 35 Animal d=new Dog(); //子类的一个实例赋值给父类的引用,只能由父类中的方法 36 37 d.eat(); 38 39 40 41 Animal c=new Cat(); 42 43 c.eat(); 44 45 46} 47
三、Datr中的接口
和Java一样,dart也有接口,但是和Java还是有区别的。
首先,dart的接口没有interface关键字定义接口,而是普通类或抽象类都可以作为接口被实现。
同样使用implements关键字进行实现。
但是dart的接口有点奇怪,如果实现的类是普通类,会将普通类和抽象中的属性的方法全部需要覆写一遍。
而因为抽象类可以定义抽象方法,普通类不可以,所以一般如果要实现像Java接口那样的方式,一般会使用抽象类。
建议使用抽象类定义接口。
例子:定义一个DB库 支持 mysql mssql mongodb
mysql mssql mongodb三个类里面都有同样的方法
1abstract class Db{ //当做接口 接口:就是约定 、规范 2 String uri; //数据库的链接地址 3 add(String data); 4 save(); 5 delete(); 6} 7 8class Mysql implements Db{ 9 10 @override 11 String uri; 12 13 Mysql(this.uri); 14 15 @override 16 add(data) { 17 // TODO: implement add 18 print('这是mysql的add方法'+data); 19 } 20 21 @override 22 delete() { 23 // TODO: implement delete 24 return null; 25 } 26 27 @override 28 save() { 29 // TODO: implement save 30 return null; 31 } 32 33 remove(){ 34 35 } 36 37} 38 39class MsSql implements Db{ 40 @override 41 String uri; 42 43 @override 44 add(String data) { 45 print('这是mssql的add方法'+data); 46 } 47 48 @override 49 delete() { 50 // TODO: implement delete 51 return null; 52 } 53 54 @override 55 save() { 56 // TODO: implement save 57 return null; 58 } 59 60} 61 62main() { 63 64 Mysql mysql=new Mysql('xxxxxx'); 65 66 mysql.add('1243214'); 67 68} 69