Skip to content

面向对象编程:抽象类与接口

抽象类

抽象类不能被实例化,可以包含抽象方法。

dart
abstract class Shape {
  // 抽象方法(无实现)
  double area();
  double perimeter();
  
  // 具体方法
  void display() {
    print('面积:${area()},周长:${perimeter()}');
  }
}

class Circle extends Shape {
  double radius;
  
  Circle(this.radius);
  
  @override
  double area() => 3.14159 * radius * radius;
  
  @override
  double perimeter() => 2 * 3.14159 * radius;
}

class Rectangle extends Shape {
  double width, height;
  
  Rectangle(this.width, this.height);
  
  @override
  double area() => width * height;
  
  @override
  double perimeter() => 2 * (width + height);
}

void main() {
  Shape circle = Circle(5);
  Shape rectangle = Rectangle(4, 6);
  
  circle.display();     // 面积:78.53975,周长:31.4159
  rectangle.display();  // 面积:24.0,周长:20.0
}

接口

在 Dart 中,每个类都隐式定义一个接口。使用 implements 实现接口。

dart
class Flyable {
  void fly() {
    print('飞行');
  }
}

class Swimmable {
  void swim() {
    print('游泳');
  }
}

class Duck implements Flyable, Swimmable {
  @override
  void fly() {
    print('鸭子在飞');
  }
  
  @override
  void swim() {
    print('鸭子在游泳');
  }
}

void main() {
  var duck = Duck();
  duck.fly();   // 鸭子在飞
  duck.swim();  // 鸭子在游泳
}

抽象类 vs 接口

dart
// 抽象类 - 可以有实现
abstract class Animal {
  void eat() {
    print('吃东西...');
  }
  
  void makeSound();  // 抽象方法
}

// 接口 - 必须实现所有方法
class Walkable {
  void walk() {
    print('行走');
  }
}

class Dog extends Animal implements Walkable {
  @override
  void makeSound() {
    print('汪!');
  }
  
  @override
  void walk() {
    print('狗在行走');
  }
}

下一步