Update: 此后,interface 关键字已从 Dart 中删除 https://stackoverflow.com/a/28595665/712173.
接口很有用,因为它们允许您切换类的实现,同时仍然允许验证传入的类型是否满足接口的要求。
采取以下(经常使用的)示例:
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 是可选类型的,所以您实际上不需要使用接口,只需编写一个包含正确方法签名的类即可(尽管工具无法验证它)。
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
所有类都是接口
最后,所有类也是接口。这意味着即使第三方系统可能是在不使用接口的情况下编写的,您仍然可以使用具体类,就像它是接口一样。
例如,想象一下以下企业库:
class EnterpriseDuck { // note: no implements keyword
void quack() {
// snip
}
}
sayQuack(EnterpriseDuck duck) { // takes an instance of the EnterpriseDuck class
duck.quack();
}
并且您希望以类型检查器可以验证的方式将模拟鸭传递到 sayQuack 方法中。您可以创建您的mockDuck来实现EnterpriseDuck隐含的接口,只需使用EnterpriseDuck作为接口即可:
class MockDuck implements EnterpriseDuck {
void quack() => "I'm a mock enterprise duck";
}
多重继承
就多重继承而言,这在 Dart 中是不可能的。但是,您可以实现多个接口并提供您自己的所需方法的实现,例如:
class MultiDuck implements Quackable, EnterpriseDuck, Swimable {
// snip...
}
接口可以有默认类
当你使用 Dart 时,你会发现大多数“类”实际上是接口。 List、String 等...都是提供默认实现的接口。你打电话时
List myList = new List();
您实际上正在使用 List 接口,并且 new 关键字从接口重定向到底层默认 List 实现。
关于团队发展
接口在团队开发中非常有用,即使在开源世界中也是如此。该接口定义了您应该构建的方法和属性,以便您的组件可以与我的组件一起工作。您可以构建您自己的该接口的测试实现,我可以构建该接口的具体实现,当我们都完成后,我们可以集成。如果没有发布的共享接口,我需要提供具体的实现,然后您才能真正开始。
希望有帮助!