Dart支持多重继承吗?

dw1jzc5e  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(170)

Dart支持的多重继承机制是什么?

lymnna71

lymnna711#

不,Dart不支持多个实现继承。
Dart有接口,和大多数其他类似的语言一样,它有多个接口继承。
对于实现,只有一个超类链,类可以从其中继承成员实现。
Dart确实有 * mixins *,它允许实现被多个类使用,但不像 * mixin应用程序 * 那样通过 * 继承 * 使用。
示例:

class A {
  String get foo;
}
class A1 implements A {
  String get foo => "A1";
}
class A2 implements A {
  String get foo => "A2";
}
mixin B on A {
  String get foo => "B:${super.foo}";
}
class C extends A1 with B {
  String get foo => "C:${super.foo}";
}
class D extends A2 with B {
  String get foo => "D:${super.foo}";
}
void main() {
  print(C().foo); // C:B:A1
  print(D().foo); // D:B:A2
}

这里,同一个成员B.foo被混合到两个不同的类中,这两个类具有两个不同的超类。
CD都只有一个超类链。C的超类是匿名mixin应用程序类A1 with BD的超类是不同的mixin应用程序类A2 with B。这两个类都包含mixin成员B.foo
mixin不是多重继承,但它是在Dart中最接近的继承。

guicsvcw

guicsvcw2#

实际上,这很简单。唯一需要理解的是,接口不是显式定义的。相反,Dart自动为所有类创建接口。这意味着你可以像实现接口一样实现一个类。对于纯接口,有抽象类。
下面是它的工作原理:

abstract class TestInterfaceA{
  String getStringA();
}

abstract class TestInterfaceB{
  String getStringB();
}

class TestInterfaceImplementer implements TestInterfaceA, TestInterfaceB{
  @override
  String getStringA() {
    return "A";
  }

  @override
  String getStringB() {
    return "B";
  }
}

main(){
  test("TestInterfaceImplementer should be able to call method from TestInterface A", () {
    TestInterfaceA testInterfaceA = TestInterfaceImplementer();

    expect(testInterfaceA.getStringA(), "A");
  });
  test("TestInterfaceImplementer should be able to call method from TestInterface B", () {
    TestInterfaceB testInterfaceB = TestInterfaceImplementer();

    expect(testInterfaceB.getStringB(), "B");
  });
}

相关问题