Как я могу имитировать множественное наследование в C# без использования интерфейсов. Я считаю, что интерфейсы не предназначены для этой задачи. Я ищу более ориентированный подход к дизайну.Как имитировать множественное наследование без интерфейсов?
ответ
ECMA-334, § 8,9 Интерфейсы
...
Интерфейсы могут использовать множественное наследование.
Так что, поскольку C# (ограниченная) поддержка «множественного наследования» идет, интерфейсы являются официальным способом.
Вы действительно не отвечаете на вопрос OPs «Как я могу имитировать множественное наследование на C# без использования интерфейсов?» –
@ Кирк: Нет, не знаю.Я отреагировал на то, что я считаю, интерфейсы не предназначены для этого задания task_, на котором основывался вопрос. –
Хотя это не совсем многократное наследование, вы можете получить «вид функций mixin», объединив интерфейсы с методами расширения.
Множественное наследование в виде класса не представляется возможным, но они могут быть реализованы в наследство многоуровневого как:
public class Base {}
public class SomeInheritance : Base {}
public class SomeMoreInheritance : SomeInheritance {}
public class Inheriting3 : SomeModeInheritance {}
Как вы можете видеть последний класс наследует функциональность всех трех классов:
Base
,SomeInheritance
иSomeMoreInheritance
Но это всего лишь наследование, и сделать это таким образом - это не хороший дизайн и просто обходной путь. Интерфейсы, конечно, являются предпочтительным способом множественного наследуемого объявления реализации (а не наследования, поскольку нет функциональности).
+1 Это способ сделать множественное наследование без интерфейсов –
Поскольку C# поддерживает только одно наследование, я считаю, что вам нужно добавить больше классов.
Существуют ли особые причины для отказа от использования интерфейсов? Из вашего описания неясно, почему интерфейсы не подходят.
Как и Маркус, используя интерфейс + методы расширения, чтобы сделать что-то вроде mixins, вероятно, ваш лучший выбор в настоящее время.
также см: Create Mixins with Interfaces and Extension Methods by Bill Wagner Примера:
using System;
public interface ISwimmer{
}
public interface IMammal{
}
class Dolphin: ISwimmer, IMammal{
public static void Main(){
test();
}
public static void test(){
var Cassie = new Dolphin();
Cassie.swim();
Cassie.giveLiveBirth();
}
}
public static class Swimmer{
public static void swim(this ISwimmer a){
Console.WriteLine("splashy,splashy");
}
}
public static class Mammal{
public static void giveLiveBirth(this IMammal a){
Console.WriteLine("Not an easy Job");
}
}
печатает splasshy, показной не легкая работа
Является ли это для какого-то реального проекта или это академический вопрос? Если это конкретный проект, пожалуйста, предоставьте более подробную информацию. –
@ Darin Dimitrov, no Это не для конкретизированного проекта. – kofucii
http://www.artima.com/designtechniques/compoinhP.html Композиция против наследования, Билл Веннерс. – rwong