C # не поддерживает множественное наследование, но, как другие предложили, вы можете использовать несколько интерфейсов. Однако даже с интерфейсами иногда требуется повторно использовать несколько реализаций интерфейса в одном классе, что опять-таки потребует множественного наследования.
Чтобы обойти это (хотя это почти никогда не нужно ), я придумала подход имитированного множественного наследования, использующий комбинацию частичных классов и T4 Text Шаблоны . Это небольшой взлом, но это лучше, чем копировать / вставлять одну и ту же реализацию интерфейса во многих производных классах. Ниже приведен упрощенный пример:
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 и указать имя всех производных частичных классов и сгенерировать несколько файлов .
Я упомянул этот подход в аналогичном вопросе здесь .