6. Dart - 抽象类 及 接口的定义
2021-03-08 本文已影响0人
Aliv丶Zz
Dart中的抽象类:主要用于定义标准,子类可以继承抽象类,也可以时间实现抽象类的方法
-
抽象类
通过abstract
关键字来定义 - Dart中的抽象方法不能用 abstract 声明, Dart中没有方法体的方法统称为
抽象方法
- 如果
非抽象
子类继承
抽象类,则必须实现抽象类里的抽象方法 - 如果把抽象类当做
接口实现
的话,必须得实现抽象类里面自定义的所有属性和方法 - 抽象类
不能被实例化
,只能被继承
,继承他的子类可被实例化
1. 抽象类
- 定义抽象类
abstract class Animal {
eat(); //抽象方法
//普通方法
printInfo() {
print("抽象类 中 普通方法");
}
}
- 抽象类的继承
class Dog extends Animal {
@override//继承抽象类,则必须实现抽象类里的抽象方法
eat() {
print('Dog eat');
}
run() {
print('Dog run');
}
}
2. 接口
首先,dart的接口没有interface
关键字定义,且普通类或抽象类都可以作为接口被实现,同样使用implements
关键字进行实现。
因为抽象类可以定义抽象方法,普通类不可以, 但是如果接口的实现是普通类的话,会将普通类和抽象类中的属性和方法全部重写一遍,所以建议使用抽象类定义接口
。
- 定义接口
abstract class A {
String brithday;
eat();
run();
}
- 接口的实现
class Pig implements A {
@override
String brithday;
@override
eat() {
// TODO: implement eat
throw UnimplementedError();
}
@override
run() {
// TODO: implement run
throw UnimplementedError();
}
}
ps:
extends抽象类 和 implements 的区别:
1. 如果要复用抽象类里面的方法,并且要用抽象类方法约束子类的话。我们就用extends继承抽象类
2. 如果是只是把抽象类当做标准的话我们就用implements实现抽象类
- 多接口的实现
abstract class A {
String brithday;
eat();
run();
}
abstract class B extends A {
jump();
}
class Animal {
String name;
String age;
Animal(this.name, this.age);
void play() {}
}
单继承单实现:
//单继承单实现
class Dog extends Animal implements A {
@override
String brithday;
Dog(String name, String age, String brithday) : super(name, age) {
this.brithday = brithday;
}
//接口方法
@override
eat() {
print('小狗 吃 🦴');
}
@override
run() {
print('小狗 running');
}
//继承方法
@override
void play() {
print('继承方法');
}
}
单继承多实现:
//单继承多实现
class Cat extends Animal implements A, B {
@override
String brithday;
Cat(String name, String age) : super(name, age);
@override
eat() {
// TODO: implement eat
throw UnimplementedError();
}
@override
jump() {
// TODO: implement jump
throw UnimplementedError();
}
@override
run() {
// TODO: implement run
throw UnimplementedError();
}
}