返回

深入浅出 Dart 继承机制:extends、implements 与 mixin 的全面解析

Android

在 Dart 中,继承是一种强大的机制,可让您创建新的类,这些类从现有的类中继承属性和行为。有三种类型的继承:extendsimplementsmixin。了解它们之间的区别至关重要,这样您才能在代码中有效地使用它们。

1. extends:子类继承父类

extends 用于创建子类,它从父类继承属性和方法。子类可以访问父类的所有 public 和 protected 成员,并且可以覆盖(override)父类中的方法以实现不同的行为。

class Animal {
  String name;

  Animal(this.name);

  void eat() {
    print('${this.name} is eating.');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);

  @override
  void eat() {
    super.eat();
    print('${this.name} is barking while eating.');
  }
}

void main() {
  Animal animal = Animal('Animal');
  animal.eat(); // Animal is eating.

  Dog dog = Dog('Dog');
  dog.eat(); // Dog is eating.
              // Dog is barking while eating.
}

2. implements:实现接口

implements 关键字用于实现接口。接口是一种只包含方法声明(没有实现)的类。类可以通过 implements 关键字实现接口,并必须实现接口中声明的所有方法。

interface Shape {
  double getArea();
}

class Circle implements Shape {
  double radius;

  Circle(this.radius);

  @override
  double getArea() => 3.14 * radius * radius;
}

void main() {
  Shape circle = Circle(5);
  print(circle.getArea()); // 78.5
}

3. mixin:引入额外的行为

mixin 类似于接口,但它允许类在不创建子类的情况下引入额外的行为。使用 with 关键字将 mixin 应用于类。mixin 中的方法可以被类中的其他方法覆盖。

mixin Flyable {
  void fly() {
    print('I am flying.');
  }
}

class Bird {
  String name;

  Bird(this.name);

  void sing() {
    print('${this.name} is singing.');
  }
}

class FlyingBird extends Bird with Flyable {
  FlyingBird(String name) : super(name);
}

void main() {
  FlyingBird flyingBird = FlyingBird('Eagle');
  flyingBird.sing(); // Eagle is singing.
  flyingBird.fly(); // I am flying.
}

结论

extendsimplementsmixin 是 Dart 中三种重要的继承类型,每种类型都有其独特的用途。extends 用于创建从现有类继承的子类,implements 用于实现接口,而 mixin 用于引入额外的行为。了解这些继承类型的区别对于有效地编写可重用和可维护的 Dart 代码至关重要。