跳到主要内容

扩展类

使用 extends 创建子类,使用 super 引用超类

dart
class Television {
  void turnOn() {
    _illuminateDisplay();
    _activateIrSensor();
  }
  // ···
}

class SmartTelevision extends Television {
  void turnOn() {
    super.turnOn();
    _bootNetworkInterface();
    _initializeMemory();
    _upgradeApps();
  }
  // ···
}

关于 extends 的另一种用法,请参阅泛型页面上关于参数化类型的讨论。

重写成员

#

子类可以重写实例方法(包括运算符)、getter 和 setter。您可以使用 @override 注解来表明您有意重写成员

dart
class Television {
  // ···
  set contrast(int value) {
    ...
  }
}

class SmartTelevision extends Television {
  @override
  set contrast(num value) {
    ...
  }
  // ···
}

重写的方法声明必须在几个方面与它重写的方法相匹配

  • 返回类型必须与被重写方法的返回类型相同(或为其子类型)。
  • 参数类型必须与被重写方法的参数类型相同(或为其超类型)。在前面的示例中,SmartTelevisioncontrast setter 将参数类型从 int 更改为超类型 num
  • 如果被重写的方法接受 n 个位置参数,则重写方法也必须接受 n 个位置参数。
  • 泛型方法不能重写非泛型方法,非泛型方法也不能重写泛型方法。

有时您可能想要缩小方法参数或实例变量的类型。这违反了正常规则,并且类似于向下转型,因为它可能在运行时导致类型错误。但是,如果代码可以保证不会发生类型错误,则缩小类型是可能的。在这种情况下,您可以在参数声明中使用 covariant 关键字。有关详细信息,请参阅 Dart 语言规范

noSuchMethod()

#

为了检测或响应代码何时尝试使用不存在的方法或实例变量,您可以重写 noSuchMethod()

dart
class A {
  // Unless you override noSuchMethod, using a
  // non-existent member results in a NoSuchMethodError.
  @override
  void noSuchMethod(Invocation invocation) {
    print(
      'You tried to use a non-existent member: '
      '${invocation.memberName}',
    );
  }
}

除非满足以下条件之一,否则您无法调用未实现的方法

  • 接收者的静态类型为 dynamic

  • 接收者具有定义未实现方法的静态类型(抽象类也可以),并且接收者的动态类型具有与 Object 类中不同的 noSuchMethod() 实现。

有关更多信息,请参阅非正式的 noSuchMethod 转发规范