携手创造,共同生长!这是我参加「日新计划 8 月更文挑战」的第10天,点击查看活动详情

引荐运用线上编辑器 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.
}
// 抽象类 Animal
abstract 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 {
}

往期精彩引荐

  • Flutter 开发出现的那些 Bugs 和解决方案「继续更新… 」
  • Dart 知识点 – 数据类型

如果读者觉得文章还能够,不防一键三连:重视➕点赞➕收藏