Dart 支持多重继承吗?

问题描述 投票:0回答:2

Dart 支持哪些多重继承机制?

dart
2个回答
12
投票

不,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
,被混合到两个不同的类中,并且有两个不同的超类。

每个类

C
D
都只有一个超类链。
C
的超类是匿名mixin应用程序类
A1 with B
D
的超类是另一个匿名mixin应用程序类
A2 with B
。这两个类都包含 mixin 成员
B.foo

Mixin 不是多重继承,但它是 Dart 中最接近的继承。


0
投票

其实,这很简单。唯一需要理解的是接口没有明确定义。相反,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");
  });
}
© www.soinside.com 2019 - 2024. All rights reserved.