Как имитировать множественное наследование без интерфейсов?


Как я могу имитировать множественное наследование в C# без использования интерфейсов. Я действительно считаю, что возможности интерфейсов не предназначены для этой задачи. Я ищу более "Дизайн Шаблон" ориентированный путь.

5   3   2010-10-03 12:26:32

5 ответов:

ECMA-334, § 8.9 интерфейсы
...
Интерфейсы могут использовать множественное наследование.

Таким образом, насколько C# (ограниченная) поддержка "множественного наследования" идет, интерфейсы являются официальным способом.

Как сказал Маркус, использование методов интерфейса + расширения, чтобы сделать что-то вроде миксинов, вероятно, ваш лучший выбор в настоящее время.

Также смотрите: Создание миксинов с интерфейсами и методами расширения Билла Вагнера Пример:

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,шлеп Нелегкая работа

Множественное наследование в виде класса невозможно, но они могут быть реализованы в многоуровневом наследовании, например:

public class Base {}

public class SomeInheritance : Base {}

public class SomeMoreInheritance : SomeInheritance {}

public class Inheriting3 : SomeModeInheritance {}
Как вы можете видеть, последний класс наследует функциональность всех трех классов:
  • Base,
  • SomeInheritance и
  • SomeMoreInheritance
Но это просто наследование, и делать это таким образом-это не хороший дизайн, а просто обходной путь. Интерфейсы, конечно, являются предпочтительным способом объявления множественной унаследованной реализации (не наследование, так как нет функциональности).

Хотя и не совсем множественное наследование, вы можете получить "своего рода функциональность mixin", комбинируя интерфейсы с методами расширения.

Поскольку C# поддерживает только одно наследование, я считаю, что вам нужно будет добавить больше классов.

Существуют ли конкретные причины для отказа от использования интерфейсов? Из вашего описания не ясно, почему интерфейсы не подходят.