inheritance - 何时使用 Dart 中的接口(interface)?

标签 inheritance interface dart

我正在阅读 Dart 的文档,对于如何使用接口(interface),我有点困惑,也许是因为我来自 Ruby。当然,接口(interface)并不是 Dart 所独有的,关于何时应该使用接口(interface)有很多解释。 This one例如,似乎是在说界面只有当你在团队中时才有用。在开源世界中,每个人都阅读并重用别人的代码,这意味着什么?

我见过的一个有趣的解释似乎暗示使用了接口(interface):

  1. 在缺乏多重继承的语言中,并且
  2. 就此而言,它们在某种程度上可以作为缺乏多重继承的解决方法。

我不明白这一点。我知道 Ruby 中的模块是一种解决方法,因为它们允许我用实际的主体定义真正的方法。接口(interface)只允许我定义实现它的类应该具有哪些方法。有什么问题吗?谁能告诉我一个真正有用的例子,我可以立即看到使用接口(interface)的值(value)?

附注与此相关的是,有没有办法在 Dart 中使用多重继承?

最佳答案

更新:the interface keyword has since been removed from Dart .

<小时/>

接口(interface)很有用,因为它们允许您切换类的实现,同时仍然允许验证传入的类型是否满足接口(interface)的要求。

采用以下(经常使用的)示例:

interface Quackable {
  void quack();
}

这定义了将传递给方法的类的要求,例如:

sayQuack(Quackable quackable) {
   quackable.quack();
}

它允许您使用 Quackable 对象的任何实现,例如:

class MockDuck implements Quackable {
  void quack() => print("quack");
}

class EnterpriseDuck implements Quackable {
  void quack() {
    // connect to three enterprise "ponds"
    // and eat some server bread
    // and say "quack" using an messaging system
  }

}

这两种实现都可以与 sayQuack() 函数一起使用,但其中一种实现比另一种需要的基础设施要少得多。

sayQuack(new EnterpriseDuck());
sayQuack(new MockDuck());

在构建利用某些“企业鸭子”的解决方案时,我在 Java 世界中一直使用这种模式。在本地开发时,我只需要能够调用 sayQuack() 函数并返回一些硬编码的模拟数据。

鸭子打字

因为 Dart 是可选类型的,所以您实际上不需要使用接口(interface),只需编写一个包含正确方法签名的类即可(尽管工具无法验证它)。

class Person {   // note: no implements keyword
  void quack() => "I'm not a duck";
}

sayQuack(new Person()); // provides the quack method, so this will still work

所有类都是接口(interface)

最后,所有类也是接口(interface)。这意味着即使第三方系统可能是在不使用接口(interface)的情况下编写的,您仍然可以使用具体类,就像它是接口(interface)一样。

例如,想象一下以下企业库:

class EnterpriseDuck { // note: no implements keyword
  void quack() {
    // snip
  }
}

sayQuack(EnterpriseDuck duck) {  // takes an instance of the EnterpriseDuck class
  duck.quack();
}

并且您希望以类型检查器可以验证的方式将模拟鸭传递到 sayQuack 方法中。您可以创建您的mockDuck来实现EnterpriseDuck隐含的接口(interface),只需使用EnterpriseDuck作为接口(interface)即可:

class MockDuck implements EnterpriseDuck {
  void quack() => "I'm a mock enterprise duck";
}

多重继承

就多重继承而言,这在 Dart 中是不可能的。但是,您可以实现多个接口(interface)并提供您自己的所需方法的实现,例如:

class MultiDuck implements Quackable, EnterpriseDuck, Swimable {
  // snip...
}

接口(interface)可以有默认类

当你使用 Dart 时,你会发现大多数“类”实际上是接口(interface)。 List、String 等...都是提供默认实现的接口(interface)。当你打电话时

List myList = new List();

您实际上正在使用 List 接口(interface),并且 new 关键字从该接口(interface)重定向到底层默认 List 实现。

关于团队发展

接口(interface)在团队开发中非常有用,即使在开源世界中也是如此。该接口(interface)定义了您应该构建的方法和属性,以便您的组件可以与我的组件一起工作。您可以构建您自己的该接口(interface)的测试实现,我可以构建该接口(interface)的具体实现,当我们都完成后,我们可以集成。如果没有发布的共享接口(interface),我需要提供具体的实现,然后您才能真正开始。

希望有帮助!

关于inheritance - 何时使用 Dart 中的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10502649/

相关文章:

flutter - 有没有什么方法可以从后台进程中清除 Flutter 应用程序

Android 某些设备上的 Flutter local_auth 问题

c++ - 继承方法,派生方法不调用基类

C++ 为什么我不能将基类分配给子类?

c++ - Worker/Controller 多线程和接口(interface)类

c# - 在不显式使用特定类的情况下传递实现接口(interface)的对象

android - FLUTTER:-我需要从Navigator.push()方法之后的方法返回一个小部件

java - 相同的方法,不同的枚举,如何设计父类?

java - 继承错误

types - 如何实现 _() 方法?