c#多重inheritance
我想在C#中实现这一点
(伪代码)
class A; class B : A; class C : A, B; ... A ac = (A)c; ... B bc = (B)c;
这可能吗?
在这种特殊情况下,您不需要多重inheritance:如果C
类仅从B
inheritance,则可以将任何C
类实例强制转换为B
和 A
; 由于B
已经从A
派生,因此C
不需要再次从A
派生:
class A { ... } class B : A { ... } class C : B { ... } ... C c = new C(); B bc = (B)c; // <-- will work just fine without multiple inheritance A ac = (A)c; // <-- ditto
(正如其他人已经说过的,如果你需要类似于多重inheritance的东西,请使用接口,因为类可以根据需要实现尽可能多的接口。)
不,C#不支持多重inheritance类。
一个类可以从一个类inheritance,也可以实现多个接口。
在C#中是不可能的,但是,您也应该考虑这是否是您真正想要的场景。
C真的是A和B吗? 或者C 有 A和B。 如果后者为真,则应使用合成而不是inheritance。
您可以使用接口进行多重inheritance。
C#不支持多重inheritance,但正如其他人建议您可以使用多个接口。 但是,即使使用接口,有时您也希望在同一个类中重用多个接口实现,这又需要多次inheritance。
为了解决这个问题(即使它几乎从不需要 ),我已经提出了使用部分类和T4文本模板的组合的模拟多重inheritance方法。 这是一个轻微的黑客,但它比在许多派生类中复制/粘贴相同的接口实现更好。 以下是一个简化示例:
IInterface.cs
public interface IInterface { void Foo(); }
InterfaceImpl.cs
public partial class InterfaceImpl : IInterface { public void Foo() { Console.WriteLine("Foo"); } }
BaseClass.cs
using System; public class BaseClass { public void Bar() { Console.WriteLine("Bar"); } }
DerivedClassA.cs
public partial class DerivedClassA : BaseClass, IInterface { public void FooBar() { this.Foo(); this.Bar(); } }
DerivedClassAInterfaceImpl.tt
<#@ template debug="false" hostspecific="true" language="C#" #> <#@ output extension=".cs" #> <# var codeText = System.IO.File.ReadAllText(this.Host.ResolvePath("InterfaceImpl.cs")).Replace("InterfaceImpl", "DerivedClassA"); #> <#= codeText #>
DerivedClassB.cs
public partial class DerivedClassB : BaseClass, IInterface { public void BarFoo() { this.Bar(); this.Foo(); } }
DerivedClassBInterfaceImpl.tt
<#@ template debug="false" hostspecific="true" language="C#" #> <#@ output extension=".cs" #> <# var codeText = System.IO.File.ReadAllText(this.Host.ResolvePath("InterfaceImpl.cs")).Replace("InterfaceImpl", "DerivedClassB"); #> <#= codeText #>
这有点令人讨厌,这需要为每个想要使用接口实现的派生类创建一个tt文件,但如果InterfaceImpl.cs超过几行代码,它仍然可以保存复制/粘贴代码。 也可能只创建一个tt文件并指定所有派生的部分类的名称并生成多个文件 。
我在这里提到了类似问题的这种方法。