我知道Java和C#中不允许多重继承.很多书只是说,不允许多重继承.但它可以通过使用接口来实现.没有讨论为什么不允许它.任何人都可以告诉我为什么不允许它?
我有两个数组.例如:
int[] Array1 = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] Array2 = new[] {9, 1, 4, 5, 2, 3, 6, 7, 8};
Run Code Online (Sandbox Code Playgroud)
确定它们是否具有相同元素的最佳方法是什么?
我已经检查了其他问题,令人惊讶的是,这个问题似乎没有被问到.使用Extension方法,接口提供有限但真正的实现多重继承.这带来了Diamond问题,与基于类的多重继承相同.为什么这比基于类的多重继承更好或更可接受,这么多人似乎觉得这么可怕?它实际上似乎是一种更糟糕的实现多重继承的方式,因为扩展方法不能进入接口本身,甚至不能进入实现接口的类,但最终可能分散在多个静态实用程序类中.
Eric Lippert在他的博客(2009年10月5日上午9:29)似乎对扩展属性的概念持开放态度,甚至提到了扩展事件,扩展操作符,扩展构造函数(也称为"工厂模式")的可能性.因此可以进一步扩展通过接口的实现.
编辑:为了阐明一个类是否继承了两个接口,这两个接口都具有相同名称和类型参数的扩展方法,那么如果在没有显式命名接口的情况下调用方法,则会产生编译错误.考虑到这一点,我错了,因为这不是钻石问题.然而,考虑到这一点提出了一个问题,即钻石问题与其他歧义相比有多重要?为什么Diamond问题是如此困难,以至于它不能用简单的编译错误来获取,就像接口扩展方法类碰撞并且不能隐式解析一样?即使在基于类的多重继承中,也可能存在非基于Diamond的成员签名冲突.
测试新的 C# 9 记录,并希望澄清为什么序列相等在记录上不起作用?
假设我有以下代码:
public record Person(string FirstName, string LastName);
Run Code Online (Sandbox Code Playgroud)
以下代码将返回 true 表示相等(这里没什么奇怪的):
var first = new Person("Bruce", "Wayne");
var second = new Person("Bruce", "Wayne");
var result = first == second; // Returns true
Run Code Online (Sandbox Code Playgroud)
但是,如果我创建以下记录:
public record Basket(string[] Items);
Run Code Online (Sandbox Code Playgroud)
我做了一个类似的测试:
var first = new Basket(new[] { "Banana", "Apple" });
var second = new Basket(new[] { "Banana", "Apple" });
var result = first == second;
Run Code Online (Sandbox Code Playgroud)
结果将返回 false。这可以通过定义自己的 Equals 方法来解决:
public record Basket(string[] Items)
{
public virtual bool Equals(Basket other)
{ …Run Code Online (Sandbox Code Playgroud)