为什么vb.net不支持多重继承?

2023-12-06

我见过一些关于为什么 c# 不实现多重继承的讨论,但很少有人讨论为什么 vb 不支持多重继承。我知道 c# 和 vb 都被编译为中间语言,因此它们都需要共享类似的限制。

VB 中缺乏多重继承似乎被认为是 dot net 中缺乏该功能的原因之一。有谁知道为什么VB不支持多重继承?我希望能有一些历史教训并讨论为什么 VB 从未考虑过这一点。


它未在 CLR 中实现,因此在 VB.NET 等符合 CLS 的语言中不可用。 Microsoft 的工程师(包括 C# 首席架构师 Anders Hejlsberg)似乎有一个普遍共识,即潜在的好处不值得付出成本和实施的复杂性。 Chris Brumme,当时 .NET 团队的一位杰出工程师,早在 2004 年就说过这样的话:

我们没有提供内置的、可验证的、符合 CLS 的多实现继承版本有几个原因:

  1. 不同的语言实际上对 MI 的工作方式有不同的期望。例如,如何解决冲突以及是否合并重复碱基或冗余碱基。在 CLR 中实现 MI 之前,我们必须对所有语言进行调查,找出共同的概念,并决定如何以语言中立的方式表达它们。我们还必须决定 MI 是否属于 CLS,以及这对于不需要此概念的语言(例如 VB.NET)意味着什么。当然,这就是我们作为公共语言运行时所从事的业务,但我们还没有时间为 MI 做这件事。

  2. 真正适合MI的地方其实很少。在许多情况下,多个接口继承可以完成这项工作。在其他情况下,您也许可以使用封装和委托。如果我们添加一个稍微不同的结构,比如 mixins,那实际上会更强大吗?

  3. 多个实现继承给实现注入了很多复杂性。这种复杂性会影响铸造、布局、调度、现场访问、序列化、身份比较、可验证性、反射、泛型以及可能的许多其他地方。

目前还不清楚这个功能是否能收回成本。这是我们经常被问到的问题。这是我们还没有进行尽职调查的事情。但我的直觉告诉我,在我们进行深入检查后,我们仍然会决定不实现该功能。

[Link]

最重要的是我不会屏住呼吸。

目前,通过继承多个接口并将实现委托给所包含的类实例,您可以获得多个实现继承的一些(如果不是大部分)好处。这需要更多的工作,但这是我们目前最好的。

我还应该指出,我多年来一直全职编写 C++,并且只在自己的设计中利用了几次多重继承。当我需要它时它很方便,但说实话,我发现自己在 C# 中并不经常需要它。

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

为什么vb.net不支持多重继承? 的相关文章

随机推荐

  • 如何在 D3 旭日图中正确旋转文本标签

    在下面的 D3 旭日图中 http jsfiddle net maxl eabFC attr transform function d return rotate d x d dx 2 Math PI 2 Math PI 180 左象限中的
  • JSF 2.0 PrimeFaces 渲染器覆盖

    我正在尝试扩展一些 primefaces 组件渲染器类以进行相同的更改 我在 faces 配置中注册新渲染器
  • 如何获取英语单词数据库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我需要一个包含每个有效英语单词的数据库 我检查了 usr share dict words文件 它包含少于 100k 字 维基百科说英语有 475k 个单词 我在哪里可以获得完整的列
  • 如何将 Java 程序转换为 .exe 文件?

    如果我有 Java 源文件 java 或类文件 class 如何将其转换为 exe 文件 我的程序还需要一个安装程序 java打包器 Java Packager 工具编译 打包并准备 Java 和 JavaFX 应用程序以供分发 javap
  • 需要关于随机函数 swift 的解释

    关于我的随机函数有一个问题 为什么会出现此错误 4294967295 is not exactly representable as Float it becomes 4294967296 我的代码是 func random gt CGFl
  • isMemberOfClass 的用法;返回错误

    在下面的代码中 我认为第二个条件为真 但结果为假 我错过了什么吗 请帮助我理解 NSArray array NSArray alloc init NSLog NSStringFromClass array class if array is
  • 无法捕获任务 android studio 的输入文件的快照

    我正在尝试制作 android studio 项目 我在 Android 设备管理器中运行项目没问题 但是当我尝试在真实设备上运行时出现一些错误 Error Failed to capture snapshot of input files
  • 与后面的视图控制器交互

    我知道 SE 上有几个与此问题相关的帖子 但我无法绕过它们来找到适合我的情况的正确解决方案 我在视图控制器中有一个地图视图 我正在展示另一个视图控制器modalPresentationStyle set as custom 容纳卡片视图 在
  • 播放保存在应用程序文档目录中的视频文件

    我有一个视频文件保存在我的应用程序的文档文件夹中的本地目录中 我想在用户单击我创建的嵌入表格视图中的项目时播放该文件 我的播放视频的代码如下 NSString documentPath NSSearchPathForDirectoriesI
  • Jquery 承诺等待 ajax 结束

    我正在获取预定义值 我必须将其插入到两个选择中 div div
  • XmlSerializer - 忽略继承的不可序列化成员

    假设您有两个类 一个继承另一个类 并且子类需要使用 XmlSerializer 进行序列化 反序列化 但是 父级包含不可序列化的成员 例如字典 public class Parent public Dictionary
  • 传递可变大小的表单

    我有一个大小 长度 可变的表单 它是从 MySQL 数据库填充的 有 4 个字段组成用于创建按钮的信息 id 按钮 名称和价格 提交表单后 我想将所有值保存到 MySQl 数据库 并使用成功消息更新页面底部的 div 对于我的所有其他页面
  • Coqide 8.5:Linux 上没有语法突出显示

    我安装了 Coqide 8 5 w nix 不幸的是 所有窗格中的文本都是黑色的 没有任何类型的语法突出显示 否则 8 5 似乎比我也安装的 8 4 有很大改进 我还得到以下信息 coqide 17272 GtkSourceView WAR
  • 从 tfs 变更集中获取文件列表

    我需要仅从 chageset 获取已更改文件的列表 并排除所有其他垃圾 我可以从命令 tf Changeset i changesetnumber 获取此信息 但除了文件列表之外 我还有很多其他信息 我不需要这些信息来实现我的目的 或者也许
  • 如何将 Best In Place 与 twitter bootstrap 结合使用

    我还没有看到任何文档 如果我有 我需要包括 data provide typeahead 并包含来源 assume City getcities to json返回包含城市名称的正确 json
  • Facebook javascript 连接本地主机域

    我正在尝试使用 javascript 创建 facebook 连接 但出现以下错误 应用程序配置不允许给定 URL 应用程序设置不允许一个或多个给定 URL 它必须与网站 URL 或画布 URL 匹配 或者该域必须是应用程序域之一的子域 是
  • 为什么我看不到添加到 DataGridView 的 DataGridViewRow?

    我正在尝试在 DataGridView 中显示行 这是代码 foreach Customers cust in custList string rowValues cust Name cust PhoneNo DataGridViewRow
  • 如果页面显示在 FRAME 中,Google Chrome 浏览器将不支持页面标题中的缓存策略

    不管我做什么
  • 如何使用 FakeItEasy 更新参数的属性

    我有一个界面 其中包含一个如下所示的成员 void ExecuteSqlCommand string procedureName SqlParameter parameters 我正在使用 FakeItEasy 创建一个模拟 以传递给我的一
  • 为什么vb.net不支持多重继承?

    我见过一些关于为什么 c 不实现多重继承的讨论 但很少有人讨论为什么 vb 不支持多重继承 我知道 c 和 vb 都被编译为中间语言 因此它们都需要共享类似的限制 VB 中缺乏多重继承似乎被认为是 dot net 中缺乏该功能的原因之一 有