在Dart语言中并没有接口的概念,但接口的功能需要其他功能来弥补,这就是抽象类。接口的作用是用于制定规范。也就是说,在接口中定义的方法,都必须在实现接口的类中实现。而且接口本身并不能实例化。
Dart中的抽象类与接口类似,但也有一定的差异。它们的区别、联系以及主要用途如下:
• Dart抽象类允许定义没有方法体的方法,这一点与接口一样。不过也允许定义包含方法体的普通方法。
• 如果在Dart抽象类中定义没有方法体的方法,那么抽象类的子类必须实现这个方法,否则子类也出现编译错误,除法将子类声明为抽象类,否则代码无法编译通过。
• 抽象类需要使用abstract关键字声明,但抽象不需要使用任何特殊关键字声明,只要在抽象类中定义没有方法体的方法,就是抽象方法。
• 抽象类与接口一样,不能实例化。
• 抽象类中有方法体的方法就是普通方法,在抽象类的子类中并不要求覆盖这些普通方法,但要想使用普通方法,必须用普通类继承抽象类,才可以实例化,并调用这些普通方法。
• 通常可以用抽象类实现多态的效果。例如,两个类都实现了同一个抽象类,并实现了其中的抽象方法。这时定义了两个变量,类型都是抽象类。然后实例化这两个类,将实例分别赋给这两个变量。尽管这两个变量中包含了同样的方法,但由于这两个类中实现方法的代码不同,所以通过这两个变量调用同名方法的效果也不同,这就叫多态。
下面给出一个实际的案例,用来演示如何编写抽象类和抽象方法,以及如何通过抽象类实现多态。
代码语言:javascript复制// 定义抽象类
abstract class ParentClass{ // 抽象方法,必须在子类中实现
void doSomething(); // 普通方法,必须要在子类中实现
void process() { print("process"); }}// 继承抽象类ParentClass的子类
class ChildClass1 extendsParentClass { // 实现doSomething抽象方法
void doSomething() { print("doSomething1"); }}// 继承抽象类ParentClass 的子类
class ChildClass2 extendsParentClass { // 实现doSomething抽象方法
void doSomething() { print("doSomething2"); }}void main() { // 多态的实现 ParentClass pc1 = ChildClass1(); ParentClass pc2 = ChildClass2(); // 调用抽象方法 pc1.doSomething(); pc2.doSomething(); // 调用普通方法 pc1.process(); pc2.process();}
运行结构如下图所示