Dart中抽象类
Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。
1、抽象类通过abstract 关键字来定义
2、Dart中的抽象方法不能用abstract声明,Dart中没有方法体的方法我们称为抽象方法。
3、如果子类继承抽象类必须得实现里面的抽象方法
4、如果把抽象类当做接口实现的话必须得实现抽象类里面定义的所有属性和方法。
5、抽象类不能被实例化,只有继承它的子类可以
extends抽象类 和 implements的区别:
1、如果要复用抽象类里面的方法,并且要用抽象方法约束自类的话我们就用extends继承抽象类
2、如果只是把抽象类当做标准的话我们就用implements实现抽象
案例:定义一个Animal 类要求它的子类必须包含eat方法
抽象类Animal,文件路径“lib/Animal.dart”
//1、抽象类通过关键字abstract进行定义
//2、抽象方法不能用abstract关键字修饰,只需定义方法名,不加方法体即可
//3、可定义公共方法,含方法体。
abstract class Animal {
eat();
}
实现子类Dog,文件路径"lib/Dog.dart",和抽象类Animal处于同一个目录文件下
import 'Animal.dart';
class Dog extends Animal{
@override
eat() {
print("小狗在eating");
}
}
实现子类Cat,文件路径"lib/Cat.dart",和抽象类Animal处于同一个目录文件下
import 'Animal.dart';
//1、通过extends关键字继承抽象类并实现抽象类中的方法
//2、抽象类中定义的公共方法也可以覆写
class Cat extends Animal {
@override
eat() {
print("小猫在eating");
}
}
main方法测试,整个项目的目录结构是把类进行了文件隔离
![](https://img.haomeiwen.com/i1652297/c725ca862627f857.png)
import 'lib/Cat.dart';
import 'lib/Dog.dart';
void main() {
Dog dog = new Dog();
dog.eat();
Cat cat = Cat();
cat.eat();
}
运行结果:
小狗在eating
小猫在eating
Dart中的多态
Datr中的多态:
允许将子类类型的指针赋值给父类类型的指针, 同一个函数调用会有不同的执行效果 。
子类的实例赋值给父类的引用。
多态就是父类定义一个方法不去实现,让继承他的子类去实现,每个子类有不同的表现。
上述代码做简单改动,Animal中只定义公共方法eat(),子类自定义其他方法,实现多态时,子类赋值给父类对象,此时父类对象只能访问父类中定义的方法。
abstract class Animal {
String name = "动物";
eat();
}
import 'Animal.dart';
//1、通过extends关键字继承抽象类并实现抽象类中的方法
//2、抽象类中定义的公共方法也可以覆写
class Cat extends Animal {
@override
eat() {
print("小猫在eating");
}
run(){
print("$name 正在 run run run");
}
注意Dog类中没有定义run方法:
import 'Animal.dart';
class Dog extends Animal{
@override
eat() {
print("小狗在eating");
}
}
main测试:
import 'lib/Animal.dart';
import 'lib/Cat.dart';
import 'lib/Dog.dart';
void main() {
Animal dog = new Dog();
dog.eat();
//这里实现多态,主要是在父类Animal中只定义基本方法
//实现多态时,该对象只能使用父类的方法
// dog.run();
Cat cat = Cat();
cat.eat();
cat.name = "王小猫";
cat.run();
}
Dart的接口和文件隔离
和Java一样,dart也有接口,但是和Java还是有区别的。
首先,dart的接口没有interface关键字定义接口,而是普通类或抽象类都可以作为接口被实现。
同样使用implements关键字进行实现。
但是dart的接口有点奇怪,如果实现的类是普通类,会将普通类和抽象中的属性的方法全部需要覆写一遍。
而因为抽象类可以定义抽象方法,普通类不可以,所以一般如果要实现像Java接口那样的方式,一般会使用抽象类。
建议使用抽象类定义接口。
定义接口AnimalBehavior,并自定义属性distance和接口方法fly():
//定义动物行为接口:fly飞行
abstract class AnimalBehavior{
int distance = 10;
fly();
}
Cat类继承Animal抽象类,并实现接口AnimalBehavior
import 'Animal.dart';
import 'AnimalBehavior.dart';
//1、通过extends关键字继承抽象类并实现抽象类中的方法
//2、抽象类中定义的公共方法也可以覆写
class Cat extends Animal implements AnimalBehavior{
@override
eat() {
print("小猫在eating");
}
@override
fly() {
print("猫居然会飞,肯定是一只飞猫!飞行距离$distance米");
}
//因为接口中定义了属性distance,所以必须复现该属性
@override
int distance = 0;
}
main()测试:
import 'lib/Cat.dart';
void main() {
Cat cat = Cat();
cat.distance= 20;
cat.eat();
cat.fly();
}
运行结果:
小猫在eating
猫居然会飞,肯定是一只飞猫!飞行距离20米
网友评论