抽象类、多态、接口、mixins(Dart)
抽象类
抽象类主要用于定义标准,在抽象类中既可以定义抽象方法,也可以定义非抽象方法。继承抽象类的子类必需实现其中的所有抽象方法,同时也可以直接调用抽象类中的非抽象方法。
/*定义一个抽象类:动物*/
abstract class Animal{
eat(); //定义抽象方法
printInfo(){//定义普通方法
print("Hello");
}
}
/*定义一个普通类:猫,使用"extends"关键字继承Animal抽象类*/
class Cat extends Animal{
eat(){ //实现抽象类中的抽象方法
print("猫吃小鱼干");
}
}
main(){
Cat cat = new Cat();
cat.eat(); //输出:猫吃小鱼干
cat.printInfo(); //输出:Hello
}
需要注意的是:
- 抽象类不可以直接实例化。直接在 main函数中书写:var animal = new Animal(); 会报错。
- 在Dart中无法实现多继承,即:class A extends B,C{... } 的书写方式是错误的,但是Dart提供了mixins,可以实现类似多继承的方法。
多态
多态就是父类定义一个方法不去实现,让继承他的子类去实现,每个子类有不同的表现。按照这种定于,上面部分所使用到的抽象方法的代码就是一种多态。
还有一种官方的定义”允许将子类类型的指针赋值给父类类型的指针,同一个函数调用会有不同的执行效果“
可以通过一下代码来理解:
/*定义一个抽象类:动物*/
abstract class Animal{
eat(); //定义抽象方法
}
/*定义一个普通类:猫,使用"extends"关键字继承Animal抽象类*/
class Cat extends Animal{
eat(){ //实现抽象类中的抽象方法
print("猫吃小鱼干");
}
run(){//定义一个所继承的抽象类中没有方法
print("小猫在跑");
}
}
/*定义一个普通类:狗,使用"extends"关键字继承Animal抽象类*/
class Dog extends Animal{
eat(){ //实现抽象类中的抽象方法
print("狗子吃骨头");
}
}
main(){
//将子类类型的指针赋值给父类类型的指针
Animal cat = new Cat();
Animal dog = new Dog();
//调用两个子类都分别实现的eat()函数,但是会有不同的执行结果
cat.eat();//输出:小猫在跑
dog.eat();//输出:狗子吃骨头
//子类中自定义的方法不能在赋值给父类类型后在调用
cat.run(); //Error
}
接口
在Dart语言中,普通类和抽象类均可以作为接口被实现。如果是普通类作为接口,就是将其中的类和方法都重写覆盖。
同时,Dart中的接口不需要使用 interface 关键字,相同的是需要使用 implements 来进行实现,可以同时implements多个接口。
所以建议:在Dart中使用抽象类来定义接口。
mixins(Dart 2.x版本)
- 使用关键字 with
- 只能继承Object类,不能继承其它类。(不能继承那些继承了其它类的类)
- mixins类不能有构造函数。
- mixins绝不是继承,也不是接口,而是一种全新的特性。
class Mother{ //作为mixins类
void motherInfo(){
print("大眼睛");
}
}
class Father{ //作为mixins类
void fatherInfo(){
print("高个子");
}
}
class Me with Mother,Father{//将Mother类和Father类作为mixins类
}
void main(){
var me = new Me();
me.motherInfo(); //输出:大眼睛
me.fatherInfo(); //输出:高个子
}