深入理解Dart:抽象类与接口的探索

发表时间: 2022-11-30 12:47

#头条创作挑战赛#

本文同步本人掘金平台的文章:
https://juejin.cn/post/7128406077502128142

推荐使用线上编辑器 dartpad.cn 进行学习,测试~

抽象类

抽象类用于描述父类拥有的一种行为,但是无法给出细节实现,需要子类来实现抽象的细节。可以简单理解抽象类就是伪代码。

抽象类一般会被定义为父类,给子类继承

抽象类的定义格式

格式如下:

abstract class className {  // 成员变量  [static][const][final] type name;    // 成员方法  [type] methodName(paramType: paramName ...);}复制代码

相关的字段说明,我们已经在之前的文章讲过。不熟悉的读者,可以进入文章 Dart 知识点 - 面向对象基础学习,这里不再赘述。

应用例子

我们定义一个抽象类 Shape,然后定义正方形 Square 类来继承抽象类并重写抽象类的方法。如下:

void main() {  Square square = new Square(10, 20);  var area = square.area();  print('Area is ${area}.'); // Area is 200.}abstract class Shape {  double width = 0.0;    double height = 0.0;    double area();}class Square extends Shape {  Square(double width, double height) {    this.width = width;    this.height = height;  }    @override  double area() {    return super.width * super.height;  }}复制代码

接口

Dart 的接口没有用 interface 关键字定义接口,而是普通类或抽象类都可以作为接口被实现。

  • 如果实现的类是普通类,需要将普通类和抽象类中的方法和属性全部重写一遍。

Dart 中只允许继承一个类,但是可以实现多个接口。

我们案例走一遍,如下:

void main() {  Dog dog = new Dog();    dog.display(); // Animal name: Jimmy    dog.walk(); // I can walk.}// 抽象类 Animalabstract class Animal {  String name = 'Jimmy';    void display() {    print('Animal name: ${name}');  }    void eat();}// 抽象类作为接口abstract class SwimAbility {  bool canSwim = false;  void swim();}// 普通类作为接口class WalkAbility {  void walk() {}}class Dog extends Animal implements SwimAbility, WalkAbility {    bool canSwim = true; // 声明接口中的属性    // 重写吃东西的方法  @override  void eat() {      }    // 重写游泳的方法  @override  void swim() {      }    // 重写散步的方法  @override  void walk() {    print('I can walk.');  }}复制代码

如何区分抽象类和接口

抽象类和接口如何区分?

  • 通过字面意思上区分(非严谨,看个人写代码的习惯),比如:
// 抽象类abstract class Animal {}// 抽象类作为接口abstract class SwimAbility {}// 普通类作为接口class WalkAbility {}复制代码
  • 通过子类中继承和接口的关键字来区别,比如:
// extends 后面跟的是父类,implements 后面跟的是接口class Dog extends Animal implements SwimAbility, WalkAbility {}复制代码

如果读者觉得文章还可以,不防一键三连:关注➕点赞➕收藏