Dart语言的接口替代品

2020-04-13 11:57:34 浏览数 (1)

在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();}

运行结构如下图所示

0 人点赞