- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在阅读 Dart 的文档,对于如何使用接口(interface),我有点困惑,也许是因为我来自 Ruby。当然,接口(interface)并不是 Dart 所独有的,关于何时应该使用接口(interface)有很多解释。 This one例如,似乎是在说界面只有当你在团队中时才有用。在开源世界中,每个人都阅读并重用别人的代码,这意味着什么?
我见过的一个有趣的解释似乎暗示使用了接口(interface):
我不明白这一点。我知道 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/
我正在尝试在我的代码库中为我正在编写的游戏服务器更多地使用接口(interface),并了解高级概念以及何时应该使用接口(interface)(我认为)。在我的例子中,我使用它们将我的包相互分离,并使
我有一个名为 Widget 的接口(interface),它在我的整个项目中都在使用。但是,它也用作名为 Widget 的组件的 Prop 。 处理此问题的最佳方法是什么?我应该更改我的 Widget
有一个接口(interface)可以是多个接口(interface)之一 interface a {x:string} interface b {y:string} interface c {z:st
我遇到了一种情况,我需要调用第三方服务来获取一些信息。这些服务对于不同的客户可能会有所不同。我的界面中有一个身份验证功能,如下所示。 interface IServiceProvider { bool
在我的例子中,“RequestHandlerProxy”是一个结构,其字段为接口(interface)“IAdapter”,接口(interface)有可能被调用的方法,该方法的输入为结构“Reque
我有一个接口(interface)Interface1,它已由类A实现,并且设置了一些私有(private)变量值,并且我将类A的对象发送到下一个接受输入作为Interface2的类。那么我怎样才能将
假设我有这样的类和接口(interface)结构: interface IService {} interface IEmailService : IService { Task SendAs
有人知道我在哪里可以找到 XML-RPC 接口(interface)的定义(在 OpenERP 7 中)?我想知道创建或获取对象需要哪些参数和对象属性。每个元素的 XML 示例也将非常有帮助。 最佳答
最近,我一直在阅读有关接口(interface)是抽象的错误概念的文章。一篇这样的帖子是http://blog.ploeh.dk/2010/12/02/InterfacesAreNotAbstract
如果我有一个由第三方实现的现有 IInterface 后代,并且我想添加辅助例程,Delphi 是否提供了任何简单的方法来实现此目的,而无需手动重定向每个接口(interface)方法?也就是说,给定
我正在尝试将 Article 数组分配给我的 Mongoose 文档,但 Typescript 似乎不喜欢这样,我不知道为什么它显示此警告/错误,表明它不可分配. 我的 Mongoose 模式和接口(
我有两个接口(interface): public interface IController { void doSomething(IEntity thing); } public inte
是否可以创建一个扩展 Serializable 接口(interface)的接口(interface)? 如果是,那么扩展接口(interface)的行为是否会像 Serilizable 接口(int
我试图在两个存储之间创建一个中间层,它从存储 A 中获取数据,将其转换为相应类型的存储 B,然后存储它。由于我需要转换大约 50-100 种类型,我希望使用 map[string]func 并根据 s
我正在处理一个要求,其中我收到一个 JSON 对象,其中包含一个日期值作为字符串。我的任务是将 Date 对象存储在数据库中。 这种东西: {"start_date": "2019-05-29", "
我们的方法的目标是为我们现有的 DAO 和模型类引入接口(interface)。模型类由各种类型的资源 ID 标识,资源 ID 不仅仅是随机数,还带有语义和行为。因此,我们必须用对象而不是原始类型来表
Collection 接口(interface)有多个方法。 List 接口(interface)扩展了 Collection 接口(interface)。它声明与 Collection 接口(int
我有一个 Java 服务器应用程序,它使用 Jackson 使用反射 API 对 DTO 进行一般序列化。例如对于这个 DTO 接口(interface): package com.acme.libr
如果我在 Kotlin 中有一个接口(interface): interface KotlinInterface { val id: String } 我可以这样实现: class MyCla
我知道Java中所有访问修饰符之间的区别。然而,有人问了我一个非常有趣的问题,我很难找到答案:Java 中的 private 接口(interface)和 public 接口(interface)有什
我是一名优秀的程序员,十分优秀!