Flutter之继承(extend)、混入(Mixin)、接口(Interface)的优先级

260 阅读1分钟

在 Dart 中,当你在继承、混入(Mixin)、和实现接口(Interface)中遇到相同的方法时,方法的选择遵循以下的优先级规则:

  1. 混入(Mixin)的方法优先级最高:如果多个混入(Mixin)含有相同的方法,最后混入(代码中最右边的混入)的方法具有最高优先级。
  2. 继承(extend)的方法次之:如果没有混入(Mixin)的方法,或混入中没有相应的方法,则会调用继承自父类的方法。
  3. 接口(Interface)中的方法优先级最低:只有当类中没有定义方法,且没有通过继承或混入获得该方法时,才会考虑接口中的方法实现。

示例

假设有以下定义:

class Base {
  void method() {
    print('Method from Base');
  }
}

mixin Mixin {
  void method() {
    print('Method from Mixin');
  }
}

class Interface {
  void method() {
    print('Method from Interface');
  }
}

class Derived extends Base with Mixin implements Interface {
  // 使用 Base, Mixin, Interface
}

在这种情况下,如果你创建 Derived 的实例并调用 method() 方法,调用的将是 Mixin 中的方法,因为混入(Mixin)具有最高的优先级:

void main() {
  Derived d = Derived();
  d.method();  // 输出 "Method from Mixin"
}

注意

  • 如果 Derived 类自己实现了 method() 方法,那么将会调用 Derived 自己的方法,因为类自己的实现总是优先考虑。
  • 接口(Interface)不会直接参与方法解析的优先级,它们提供的是一个契约。当你使用 implements 声明一个接口时,你需要在类中提供或通过继承/混入获得那些方法的实现。

在设计类的结构时,明确方法的来源和优先级对于避免意外行为非常重要。理解这些规则可以帮助你更好地控制方法的覆盖和类行为的预期。