К лучшему или худшему, C # не поддерживает множественное наследование. Тем не менее, я имел ограниченный успех в моделировании его с помощью методов расширения . Подход метода расширения может выглядеть следующим образом.
public class A
{
public void DoSomething() { }
}
public static class B
{
public static void DoSomethingElse(this A target) { }
}
public class C : A
{
}
Очевидная проблема здесь в том, что C
определенно не B
. Поэтому единственное, для чего это хорошо, - это избегать дублирования кода в некоторых ситуациях.
С другой стороны, C # поддерживает реализацию нескольких интерфейсов. Это будет выглядеть так.
public interface IA
{
void DoSomething();
}
public interface IB
{
void DoSomethingElse();
}
public class A : IA
{
void DoSomething() { }
}
public class B : IB
{
void DoSomethingElse() { }
}
public class C : IA, IB
{
private A m_A = new A();
private B m_B = new B();
public void DoSomething() { m_A.DoSomething(); }
public void DoSomethingElse() { m_B.DoSomethingElse(); }
}
Очевидная проблема здесь в том, что пока вы наследуете интерфейс, вы не наследуете реализацию. Это хорошо для полиморфизма, но плохо для избежания дублирования кода.
Иногда вы можете использовать обе стратегии вместе, чтобы собрать воедино что-то, похожее на множественное наследование, но это, вероятно, будет трудно понять и поддерживать. Если ваша ситуация действительно требует множественного наследования, тогда ваши возможности ограничены и, конечно, не идеальны, но, тем не менее, они существуют.