接口+扩展(mixin)与基类

2024-02-15

接口+扩展方法(mixin)比抽象类更好吗?

如果你的答案是“这取决于”,那么它取决于什么?

我认为接口+扩展方法有两个可能的优点。

  • 接口是可多重继承的,而类则不能。
  • 您可以使用扩展方法以不间断的方式扩展接口。 (实现您的接口的客户端将获得您的新基本实现,但仍然能够覆盖它。)

我还没有想到这种方法的缺点。接口+扩展方法失败的原因可能很简单。

关于这个主题的两篇有用的文章是

  • 使用接口和扩展方法创建 Mixins http://msdn.microsoft.com/en-us/vcsharp/bb625996.aspx
  • 抽象基类也有版本控制问题 http://haacked.com/archive/2008/02.aspx

扩展方法的缺点:C#3/VB9 之前的客户端将无法轻松使用它。

就我而言,就是这样 - 我认为基于界面的方法要好得多。然后,您可以很好地模拟您的依赖关系,并且所有内容基本上都不太紧密耦合。我不太喜欢类继承,除非它真的是关于专业化:)

编辑:我刚刚想到了另一个好处might具有相关性。某些具体实现可能可以提供某些通用方法的更优化版本。

Enumerable.Count就是一个很好的例子 - 它显式检查序列是否实现IList或不,因为如果它可以调用Count在列表上而不是迭代整个序列。如果IEnumerable<T>是一个带有虚拟的抽象类Count()方法,它可能已被重写List<T>而不是有一个单一的实现知道IList明确地。我并不是说这总是相关的,也不是说IEnumerable<T>应该是一个抽象类(绝对不是!) - 只是指出它是一个可能的小缺点。这就是多态性真正合适的地方,通过专门化现有的行为(诚然,以一种只影响性能而不影响结果的方式)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

接口+扩展(mixin)与基类 的相关文章

随机推荐

  • 将backbone.js 与hammer.js 结合使用

    想知道是否有人在hammer js中使用过backbone以及如何实现Backbone View与hammer js 的拖动 按住事件有关吗 您不能直接在 delegateEvents 中使用 Hammerjs 事件 但有一些插件可以修补
  • 可能从日期字符串注入选择查询

    我有一个有点奇怪的问题 我的页面包含一个 html 链接 该链接刷新页面并调用 PHP 变量 此变量将日期字符串附加到 url 字符串 该字符串被输入到 MySQL 查询中 该查询会抓取与该日期匹配的记录 我认为这会导致注入 因为它有时会从
  • Java检查字符串中的重复字母

    我在弄清楚如何检查用户输入的重复字母时遇到问题 程序需要将重复的字母输出为 true 如果没有则输出为 false 程序不应计算重复的数字或符号 例如 用户输入 巧克力程序输出 真 用户输入 112奶油程序输出 假 这是另一个版本 基于 r
  • 使用 JSDoc 记录工厂

    为了避免使用new在我的 JavaScript 代码中 我编写工厂来创建对象 我尝试了很多种组合 最令我满意的结果如下 Document module module app document function use strict Fact
  • 全8位加法器,非逻辑输出

    我创建了一个带全加器的 8 位加法器 正如您所看到的 我开始从右到左添加相应的位 对于 cin 信号 t1 和 t2 并按顺序 cout t2 和 t1 第一个 cin 设置为加法器输入 cin 我在实现中没有看到任何问题 但是当我运行它时
  • Office365 执行多个请求时出现“addFileAttachmentAsync”错误

    我遇到问题添加文件附件异步 我有 2 个数组 嵌入文件 包含将附加到正文中的文件名 和附件 包含将作为附件的文件名 我有2个for为每个数组运行循环 它们应该对数组中的每个文件向 Exchange Server 发出 GET 请求并获取二进
  • 在 iOS 中读取文本文件

    如何将文本文件读入textView 我有许多不同的文本文件 用户选择显示哪个 所以这就是为什么我不只是在其中有一个文件名 我真的很困惑为什么这不起作用 我在 Apple 开发者网站上有关从文件读取到字符串的部分中找到了它 NSString
  • PHPExcel图表不反转垂直轴

    我正在使用 PHPExcel 以便使用条形图导出 Excel 图表 我可以将默认布局的图表导出为下图 但是 我想将轴布局放在图表顶部并反转 Y 轴 如下图所示 我怎样才能做到这一点 研究代码后我发现它是possible反转轴 yAxis n
  • Alfresco 创建一个新用户组,仅允许创建用户和组

    我想创建一个新用户组 该用户组中的成员可以创建新用户和新组 我认为创建用户或组需要admin允许 该用户组除了创建 编辑 删除用户 组外 没有其他管理权限 alfresco社区4 0c中是否提供了这种群组 我该如何实施 如何添加具有指定权限
  • 邮政编码应使用什么 html5 表单属性?

    最好使用限制字符数的 文本 属性 还是可以在邮政编码的输入中使用数字属性 只是想了解 html5 中表单的所有不同属性 干杯 你可以试试这个
  • java中时间轴和线程有什么区别

    以下两个简单的片段执行相同的操作 打印 Hello world 每一秒 但它们之间有什么区别呢 什么时候应该使用线程 什么时候应该使用时间轴 Timeline 内部是否启动一个线程 如果没有 如何在不阻塞主线程的情况下每秒执行一次打印 Ti
  • Lucene.net 搜索引擎

    我有一个文件夹 里面有 20 个文本文件 我希望索引该文件夹并在这些文件中搜索任何关键字 我怎样才能在 C 中做到这一点 这是对 lucene Net 的一个很好的介绍 Lucene Net 简介 CodeProject http www
  • Selenium SendKeys() 与 Chromedriver 使用剪贴板内容而不是电子邮件地址中的“@”字符

    我正在尝试使用 C 中的 Selenium 和 ChromeDriver 将电子邮件地址写入输入字段 到目前为止还没有什么引人注目的事情 但对于包含 字符的字符串 它将发送剪贴板的内容而不是该字符 例如 剪贴板的内容是 MYCLIPBOAR
  • 如何在java中插入多个制表符字符串? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何在Java中插入多个制表符字符串 这个例子 getName t t getLastName 不起作用 你的例子应该有效 但是没有理由单
  • 私有标识符仅在针对 ECMAScript 2015 及更高版本 (Angular 9) 时可用

    我正在从 Angular 8 2 升级到 9 1 并且我正在尝试将私有字段更改为 fieldName any在允许的情况下TS 3 8 https www typescriptlang org docs handbook release n
  • 休息模板 org.apache.http.NoHttpResponseException

    我有两个 Spring Boot 服务 A 和 B 还有一个外部服务 C 这是请求路径 Web 浏览器 服务 A 服务 B 外部服务 C 外部服务正在返回返回到前端的资源 对于 A B 和 C 之间的通信 我使用 Rest Template
  • Lion 10.7.3:Apple 目前不接受使用此版本操作系统构建的应用程序

    我在 Lion 10 7 2 上运行 Xcode 4 2 并且有一些应用程序需要更新到 Lion 沙箱 因此我可以将它们重新提交到 Mac App Store Mac 而不是 iOS 在此过程中 我弹出了一个更新到组合更新 10 7 3 的
  • Facebook lint 中的“无法获取作曲家模板数据”是什么意思?

    我在 Facebook 上创建了一个简单的原型应用程序 当我的测试脚本 Ubuntu 命令行上的 JavaScript 由 Node js 提供支持 尝试访问该应用程序时 它会生成以下错误消息 error message Invalid O
  • 没有时区信息的 Javascript ASP.net 日期格式 - 时区偏移

    我有一个客户端 JavaScript 可以在 JavaScript 中生成日期 new Date 2007 5 1 我需要将此日期传递到后面的代码可以访问的隐藏字段 我的问题是 当隐藏字段转换为 DotNet 日期时间时 时间不正确 这是因
  • 接口+扩展(mixin)与基类

    接口 扩展方法 mixin 比抽象类更好吗 如果你的答案是 这取决于 那么它取决于什么 我认为接口 扩展方法有两个可能的优点 接口是可多重继承的 而类则不能 您可以使用扩展方法以不间断的方式扩展接口 实现您的接口的客户端将获得您的新基本实现