Dart:在Dart中,implements和extends有什么区别?

4

https://dart.dev/guides/language/language-tour#implicit-interfaces

我看到过使用 "implements" 的代码,所以我正在研究 "implements"。但是我在官方文档中看不出与 "extends" 的区别。
从官方文档中的示例代码来看,使用 implements 只是在 extends 能做的情况下进行了实现。然后我就想知道是否应该使用 "extends"。目前,我认为我已经理解了继承(extends)和 mixin(with)。Dart 文档中也提到了 "interface" 这个词,但没有明确定义,我甚至找不到在哪里。我对其他语言中的接口并没有太多了解,因此很难形成一个概念。
继承和实现究竟有什么区别?由于差异,何时使用继承 “extends”,何时使用实现 “implements”?
示例中是否存在清晰区别的地方?

1
你链接的页面试图解释它(可能没有像它应该的那样清晰):“如果你想创建一个支持类B API的类A,而不继承B的实现,类A应该实现B接口。” - jamesdlin
4个回答

10

给定类 MyClass:

  • MyClass extends Foo 是经典的继承。 MyClass 是一个 Foo
  • MyClass implements Bar 表示实现者符合 Bar 接口。 MyClass "看起来像" 一个 Bar
  • MyClass with Batz 是将接口和实现混合在一起。 MyClass "表现得像" 一个 Batz

MyClass 可以实现和混合任意数量的接口(但有一些限制),但只能从一个接口继承。


1
感谢您提供易于理解的解释。 - 森口万太郎
概括一下Dart的大致情况, ● 首先,继承只能是单一继承 ● 毕竟,在实现目标和混合目标中,成员的存在都得到了保证,但是从语义上讲, 实现“implements”在强制实现目标类实现成员以实现多态性方面具有重要意义。(需要实现所有成员)Mixin的主要目的是通过重用代码来提高可维护性,以应对代码变更。是这样吗? - 森口万太郎

2
除了其他解释外,Dart不允许开发人员使用多重继承,因此只能有一个扩展,但可以有多个实现。因此,一个类只能是一个类的子类型(除了父类的父类),但接口定义了实现它的类的行为,并且一个类可以具有不同的行为。一个简单的比喻来自于动物。如果我们假设有不同的动物行为,比如游泳接口ISwimmer,奔跑接口IRunner和飞行接口IFlyer。例如,Fish类是Animal,这使它扩展了Animal类。此外,Fish还具有游泳行为,因此在这个目的下,它实现了ISwimmer接口。

感谢您提供易于理解的解释。 - 森口万太郎
概括一下Dart的大致情况, ● 首先,继承只能是单一继承 ● 毕竟,在实现目标和混合目标中,成员的存在都得到了保证,但是从语义上讲, 实现“implements”在强制实现目标类实现成员以实现多态性方面具有重要意义。(需要实现所有成员)Mixin的主要目的是通过重用代码来提高可维护性,以应对代码变更。是这样吗? - 森口万太郎

1
如果你只是想了解它们在概念上的不同,那么:
你可以扩展一个类。把它想象成你扩展了你的父亲,或者你的父亲是你的基类。
你可以实现一个接口(这只是一个纯抽象类)。就像法拉利实现了一辆汽车。
接口不能有实例。例如 - 你见过任何一辆CAR吗?答案是否定的,你看到的是汽车的类型,比如 Ford、Toyota 实现了 CAR,所以汽车充当接口,其他公司或者说 Ferrari 类实现了它。
要被称为汽车,你必须实现汽车的每个特性,这就是为什么接口的每个方法都需要被实现,我们说 x "实现" y。
在扩展中,你可以覆盖某些内容并跳过另外一些内容,比如你的鼻子可能像你的父亲,但你的耳朵不像。
把接口想象成一个骨架或一个空类。

概括一下Dart的大致情况, ● 首先,继承只能是单一继承 ● 毕竟,在实现目标和混合目标中,成员的存在都得到了保证,但是从语义上讲, 实现“implements”在强制实现目标类实现成员以实现多态性方面具有重要意义。(需要实现所有成员)Mixin的主要目的是通过重用代码来提高可维护性,以应对代码变更。是这样吗? - 森口万太郎
感谢您提供易于理解的解释。 - 森口万太郎

0
另一个可能帮助你理解的定义是:使用extends使类继承(extends)其父类,通过继承(extends),即使不重写父类的属性,也可以使用父类的属性和方法,同时还可以使用自己的属性和方法。此外,你应该验证这个子类是否遵守了父类的约束,没有违反父类的限制。
当你只想限制类的属性为抽象类的属性,但是有自己对这些属性的实现时,使用implements。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接