C#是否支持多重继承?

时间:2010-03-16 16:28:06

标签: c# multiple-inheritance

一位同事和我对多重继承有一点争论。我说它不受支持,而且他说的是。所以,我以为我会在网上问一些聪明的人。

17 个答案:

答案 0 :(得分:85)

抱歉,您无法继承multiple classes。您可以使用接口或one class and interface(s)的组合,其中接口应在签名中跟随类名。

interface A { }
interface B { }
class Base { }
class AnotherClass { }

继承的可能方式:

class SomeClass : A, B { } // from multiple Interface(s)
class SomeClass : Base, B { } // from one Class and Interface(s)

这不合法:

class SomeClass : Base, AnotherClass { }

答案 1 :(得分:40)

不,请改用接口! ^。^

答案 2 :(得分:19)

C#不支持多重继承。

但是如果你想从两个来源“继承”行为,为什么不使用组合:

  • 组合物

  • 依赖注入

有一个基本但重要的OOP原则可以说:“赞成组合而不是继承”。

你可以创建一个这样的类:

public class MySuperClass
{
    private IDependencyClass1 mDependency1;
    private IDependencyClass2 mDependency2;

    public MySuperClass(IDependencyClass1 dep1, IDependencyClass2 dep2)
    {
        mDependency1 = dep1;
        mDependency2 = dep2;
    }

    private void MySuperMethodThatDoesSomethingComplex()
    {
        string s = mDependency1.GetMessage();
        mDependency2.PrintMessage(s);
    }
}

正如您所见,通过构造函数注入了dependecies(接口的实际实现)。您的类不知道每个类是如何实现的,但它知道如何使用它们。因此,这里涉及的类之间存在松散的耦合,但具有相同的使用能力。

今天的趋势表明继承有点“过时”。

答案 3 :(得分:13)

C#3.5或更低版本不支持多重继承,但C#4.0可以通过使用我记忆中的动态来实现这一点。

答案 4 :(得分:7)

你不能在C#到3.5之前做多重继承。我不知道它是如何在4.0上运行的,因为我没有看过它,但@tbischel发布了一个我需要阅读的链接。

C#允许您通过接口进行“多重实现”,这与“多重继承”完全不同

所以,你做不到:

class A{}

class B{}

class C : A, B{}

但是,你可以这样做:

interface IA{}
interface IB{}

class C : IA, IB{}

HTH

答案 5 :(得分:5)

C#不支持多继承类,但允许继承/实现任意数量的接口。

这是非法的 (B,C,D& E都是类)

class A : B, C, D, E
{
}

这是合法的 (IB,IC,ID和IE都是接口)

class A : IB, IC, ID, IE
{
}

这是合法的 (B是类,IC,ID和IE是接口)

class A : B, IC, ID, IE
{
}

Composition over inheritance是一种设计模式,即使在支持多重继承的语言中也是如此。

答案 6 :(得分:4)

与Java(C#是间接派生的)一样,C#不支持多个inhertance。

这就是说,数据(成员变量和属性)只能从单个父基础继承。另一方面,类行为(成员方法)可以从多个父基础接口继承

一些专家,特别是Bertrand Meyer(被一些人认为是面向对象编程的父亲之一)认为这使得C#(和Java,以及所有其他人)不再是“真正的”对象面向语言。

答案 7 :(得分:3)

实际上,这取决于你对继承的定义:

  • 您可以从单个类继承实现(成员,即数据和行为),但
  • 您可以从多个继承接口,以及接口。

这不是“继承”一词的通常含义,但以这种方式定义也并非完全不合理。

答案 8 :(得分:2)

你可能想进一步讨论你的论点并讨论设计模式 - 你可以找出为什么他想要在c#中继承多个类,如果他甚至可以

答案 9 :(得分:2)

答案 10 :(得分:2)

多重继承允许程序员创建组合多个类及其相应层次结构的方面的类。对于前者C ++允许您从多个类继承

在C#中,只允许从单个父类继承类,这称为单继承。但是你可以使用接口或一个类和接口的组合,其中接口应该在签名中跟着类名。

例如:

Class FirstClass { }
Class SecondClass { }

interface X { }
interface Y { }

您可以继承以下内容:

类NewClass:X,Y {} 在上面的代码中,类" NewClass"是从多个接口创建的。

类NewClass:FirstClass,X {} 在上面的代码中,类" NewClass"是从界面X和类" FirstClass"。

创建的

答案 11 :(得分:2)

您不能一次继承多个类。但是有一个选项可以通过界面帮助完成。见下面的代码

interface IA
{
    void PrintIA();
}

class  A:IA
{
    public void PrintIA()
    {
        Console.WriteLine("PrintA method in Base Class A");
    }
}

interface IB
{
    void PrintIB();
}

class B : IB
{
    public void PrintIB()
    {
        Console.WriteLine("PrintB method in Base Class B");
    }
}

public class AB: IA, IB
{
    A a = new A();
    B b = new B();

    public void PrintIA()
    {
       a.PrintIA();
    }

    public void PrintIB()
    {
        b.PrintIB();
    }
}

您可以按以下方式调用它们

AB ab = new AB();
ab.PrintIA();
ab.PrintIB();

答案 12 :(得分:1)

通常,您无法做到。

考虑这些接口和类:

public class A { }    
public class B { }
public class C { }

public interface IA { }
public interface IB { }

您可以继承多个接口:

class A : B, IA, IB {
  // Inherits any single base class, plus multiple interfaces.
}

但是你不能继承多个

class A : B, C, IA, IB {
    // Inherits multiple base classes, plus multiple interfaces.
}

答案 13 :(得分:1)

它不允许它,使用接口来实现它。

为什么会这样?

以下是答案:它允许编译器做出一个非常合理和理性的决定,这个决定总是与继承的内容和继承的地方保持一致,这样当你进行投射时你总是知道你正在处理哪个实施。

答案 14 :(得分:1)

C#不支持内置多重继承。

要将多重继承添加到不支持它的语言,您可以使用twin design pattern

答案 15 :(得分:0)

作为对已建议内容的另一个建议,另一种提供类似于多重继承的功能的聪明方法是实现多个接口,然后在这些接口上提供扩展方法。这称为mixins。它不是一个真正的解决方案,但它有时会处理会促使您想要执行多重继承的问题。

答案 16 :(得分:0)

我最近以某种方式进入了相同的思维方式,将两个类继承到一个类中,并最终显示在此页面上(即使我更了解),并且希望继续引用我在这种情况下发现的完美解决方案,而不必强制实施接口数量

我对这个问题的解决方案是将您的数据分成有意义的类:

public class PersonAddressSuper
{
    public PersonBase Person { get; set; }
    public PersonAddress Address { get; set; }

    public class PersonBase
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
    public class PersonAddress
    {
        public string StreetAddress { get; set; }
        public string City { get; set; }
    }
}

稍后在代码中,您可以像这样使用它:

同时包括基本部分和地址

PersonAddressSuper PersonSuper = new PersonAddressSuper();
PersonSuper.PersonAddress.StreetAddress = "PigBenis Road 16";

仅基础:

PersonAddressSuper.PersonBase PersonBase = new PersonAddressSuper.PersonBase();
PersonBase.Name = "Joe Shmoe";

仅地址:

PersonAddressSuper.PersonAddress PersonAddress = new PersonAddressSuper.PersonAddress();
PersonAddress.StreetAddress = "PigBenis Road 16";