3

多重继承的优缺点是什么?

为什么我们在 C# 中没有多重继承?

更新 好的,因此目前避免了因为冲突解决正在调用哪个父方法等问题。当然这是程序员要解决的问题。或者,这可以像 SQL 一样解决,其中存在冲突需要更多信息,即 ID 可能需要变为 Sales.ID 才能解决查询中的冲突。

4

6 回答 6

6

这是关于多重继承陷阱的一个很好的讨论:

为什么我应该避免 C++ 中的多重继承?

以下是 C# 团队关于为什么他们决定不允许多重继承的讨论:

于 2009-04-20T00:03:51.860 回答
3

我将根据我一直在转换为 REALbasic(它具有接口但只有单一继承)的 C++ 报告编写器提供一个专业人士。

多重继承使得从实现功能并具有记住状态的属性的小型 mixin 基类组合类变得更加容易。如果做得好,您可以大量重用小代码,而无需复制和粘贴类似的代码来实现接口。

幸运的是,REALbasic 具有扩展方法,类似于最近在 C# 3.0 中添加到 C#的扩展方法。这些有助于解决这个问题,特别是因为它们可以应用于数组。由于折叠了以前多重继承的类,我仍然得到了一些更深的类层次结构。

于 2009-04-20T00:20:29.933 回答
3

It's just another tool in the toolbox. Sometimes, it is exactly the right tool. If it is, having to find a workaround because the language actually prohibits it is a pain and leads to good opportunities to screw it up.

Pros and cons can only be found for a concrete case. I guess that it's quite rare to actually fit a problem, but who are the language designers to decide how I am to tackle a specific problem?

于 2009-04-20T00:29:27.557 回答
1

主要缺点是如果两个类有一个同名的方法,新的子类不知道调用哪一个。

在 C# 中,您可以通过在子对象中包含每个父对象的实例来进行多重继承。

class MyClass
{
    private class1 : Class1;
    private class2: Class2;

    public MyClass
    {
        class1 = new Class1;
        class2 = new Class2;
    }
    // Then, expose whatever functionality you need to from there.
}
于 2009-04-20T00:10:08.837 回答
0

当您从某个东西继承时,您在以各种方式断言您的类属于该(基本)类型,除了您可能会稍微不同地实现某些东西或向其添加某些东西,实际上您的类同时是2 个东西是极其罕见的。通常它只是对 2 个或更多事物具有共同的行为,而更好的描述方式通常是让您的类实现多个接口。(或可能封装,取决于您的情况)

于 2009-04-20T00:24:36.867 回答
0

这是那些帮助我不要拍自己的脚怪癖之一,就像在 Java 中一样。

尽管从多个来源扩展字段和方法是件好事(想象一个现代手机,它继承自 MP3 播放器、相机、卫星导航和简陋的老式手机),但仅靠编译器无法解决冲突。

于 2009-04-20T00:27:12.243 回答