Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#支持多重继承吗?_C#_Multiple Inheritance - Fatal编程技术网

C#支持多重继承吗?

C#支持多重继承吗?,c#,multiple-inheritance,C#,Multiple Inheritance,我的一位同事和我就多重继承发生了一些争论。我是说它不被支持,他是说它被支持。所以,我想我应该问问网络上那些聪明的人。不,用接口代替!^^ C#3.5或更低版本不支持多重继承,但我记得,C#4.0可以通过使用动力学来实现这一点。很抱歉,您不能从多个类继承。您可以使用接口或一个类和接口的组合,其中接口应位于签名中的类名之后 接口A{} 接口B{} 类基{} 类另一类{} 可能的继承方式: class SomeClass:A,B{}//来自多个接口 类SomeClass:Base,来自一个类和接口的

我的一位同事和我就多重继承发生了一些争论。我是说它不被支持,他是说它被支持。所以,我想我应该问问网络上那些聪明的人。

不,用接口代替!^^

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

很抱歉,您不能从多个类继承。您可以使用接口或一个类和接口的组合,其中接口应位于签名中的类名之后

接口A{}
接口B{}
类基{}
类另一类{}
可能的继承方式:

class SomeClass:A,B{}//来自多个接口
类SomeClass:Base,来自一个类和接口的B{}//
这是不合法的:

class-SomeClass:Base,另一个类{}
与Java一样(Java是C#的间接派生源),C#不支持多重固有

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


一些专家,特别是(被一些人认为是面向对象编程的创始人之一)认为,这使得C#(和Java以及其他所有语言)无法成为“真正的”面向对象语言。

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

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

这不是通常所说的“继承”一词的意思,但用这种方式来定义它也并非完全不合理。

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

您可能想进一步讨论您的论点,并讨论设计模式-您可以了解为什么他会费心尝试从c中的多个类继承;如果他甚至可以

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

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

因此,你不能这样做:

class A{}

class B{}

class C : A, B{}
但是,你可以做到:

interface IA{}
interface IB{}

class C : IA, IB{}

在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);
    }
}
正如您所见,依赖项(接口的实际实现)是通过构造函数注入的。您的类不知道每个类是如何实现的,但它知道如何使用它们。因此,此处涉及的类之间存在松散耦合,但使用能力相同


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

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

这是非法的 (B、C、D&E均为等级)

这是合法的 (IB、IC、ID和IE均为接口)

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


是一种设计模式,即使在支持多重继承的语言中似乎也是有利的。

通常情况下,您不能这样做。

考虑以下接口和类:

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.
}
但不能继承多个类:


多重继承允许程序员创建结合了多个类及其相应层次结构的方面的类。对于C++,C++允许您从多个类< /p>继承。 在C#中,类只允许从单亲类继承,这称为单继承。但是您可以使用接口或一个类和接口的组合,其中接口后面应该跟有签名中的类名

例:

您可以按如下方式继承:

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

类NewClass:FirstClass,X{}
在上面的代码中,类“NewClass”是从接口X和类“FirstClass”创建的。

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

为什么会这样?

答案是这样的:它允许编译器做出一个非常合理的决定,这个决定总是要一致地说明继承了什么以及从何处继承,这样当您进行强制转换时,您总是能够确切地知道您要处理的是哪个实现。

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


要向不支持多重继承的语言添加多重继承,可以使用

一次不能继承多个类。但是,通过界面的帮助,可以选择这样做。请参阅下面的代码

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();

我最近不知何故也有了同样的想法,将两个类继承到一个类中,并最终出现在这一页上(尽管我知道得更好),我希望继续参考我在这个场景中发现的完美解决方案,而不强制实现接口

我对这个问题的解决办法是分开的
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.
}
Class FirstClass { }
Class SecondClass { }

interface X { }
interface Y { }
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();
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";