返回

Dart 中 extends, with, implements, on 关键字详解

IOS

想要在 Dart 中灵活使用类,就需要熟知 extends、with、implements、on 这四个的用法和区别。这篇文章将深入解析这四个关键字,助你全面掌握 Dart 中类的继承和混合机制。

Dart 是支持基于 mixin 继承机制的面向对象语言,所有对象都是一个类的实例,而除了 Null 以外的所有类都继承自 Object 类。了解这四个关键字的用法和区别,对灵活使用类大有裨益。

1. extends:传统继承

Dart 中的类继承采用 extends 关键字。通过 extends,可以派生出一个子类,该子类继承父类的所有属性和方法。子类可以重写父类的方法,以提供自己的实现。

例如,我们可以定义一个 Animal 类,它具有 nameage 属性。然后,我们可以定义一个 Dog 类,它继承自 Animal 类,并添加了 breed 属性。

class Animal {
  String name;
  int age;

  Animal(this.name, this.age);

  void speak() {
    print('Animal $name says...');
  }
}

class Dog extends Animal {
  String breed;

  Dog(String name, int age, this.breed) : super(name, age);

  @override
  void speak() {
    print('Dog $name says woof!');
  }
}

2. with:mixin 继承

mixin 是一种特殊的类,它不能被实例化,但可以被其他类继承。mixin 的作用是将代码复用。例如,我们定义一个 Flyable mixin,它提供了一个 fly() 方法。然后,任何类都可以通过 with 关键字继承 Flyable mixin,从而获得 fly() 方法。

mixin Flyable {
  void fly() {
    print('I can fly!');
  }
}

class Bird with Flyable {
  String name;

  Bird(this.name);

  void sing() {
    print('Bird $name sings...');
  }
}

3. implements:接口实现

接口是一种定义了方法签名的类,它不包含任何实现。类可以通过 implements 关键字实现接口,从而获得接口中定义的方法。接口可以有多个实现类,实现类可以是不同的类型。

例如,我们定义一个 Drawable 接口,它定义了一个 draw() 方法。然后,我们可以定义一个 Circle 类和一个 Rectangle 类,它们都实现 Drawable 接口。

abstract class Drawable {
  void draw();
}

class Circle implements Drawable {
  int radius;

  Circle(this.radius);

  @override
  void draw() {
    print('Drawing a circle with radius $radius.');
  }
}

class Rectangle implements Drawable {
  int width;
  int height;

  Rectangle(this.width, this.height);

  @override
  void draw() {
    print('Drawing a rectangle with width $width and height $height.');
  }
}

4. on:类型混入

on 关键字用于指定 mixin 的类型参数。在某些情况下,需要为 mixin 指定类型参数,以便在继承时正确地解析类型。例如,我们可以定义一个 Comparable mixin,它比较两个对象的大小。

mixin Comparable<T> {
  int compareTo(T other);
}

class Person implements Comparable<Person> {
  String name;
  int age;

  Person(this.name, this.age);

  @override
  int compareTo(Person other) {
    return age - other.age;
  }
}

对比总结

这四个关键字在 Dart 中的使用场景有所不同,下面总结一下他们的区别:

  • extends :用于单继承,子类继承父类所有属性和方法,可以重写父类方法,提供自己的实现。
  • with :用于 mixin 继承,mixin 不能被实例化,但可以被其他类继承,mixin 的作用是将代码复用。
  • implements :用于接口实现,接口定义方法签名,但没有实现,类可以通过 implements 实现接口,从而获得接口中定义的方法。
  • on :用于指定 mixin 的类型参数,在某些情况下,需要为 mixin 指定类型参数,以便在继承时正确地解析类型。

希望这篇文章能让你对 Dart 中的继承和混合机制有更深入的了解。