一位同事和我对多重继承有一点争论。我说它不受支持,而且他说的是。所以,我以为我会在网上问一些聪明的人。
答案 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";