Нужна функция множественного наследования в C#. Что я делаю не так?

class UDPClient
{
}

class LargeSimulator
{
}

class RemoteLargeSimulatorClient : UDPClient, LargeSimulator
{
}

Как говорится, если вам нужно множественное наследование, ваш дизайн не работает.

Как мне сделать это на С# без необходимости что-либо реализовывать?


person jaybny    schedule 21.06.2011    source источник
comment
похоже, что ваш дизайн выключен.   -  person bzlm    schedule 21.06.2011
comment
редактировать: я хочу наследование реализации, а не наследование интерфейса... да, я знаю об интерфейсах... мне просто интересно, является ли С# просто набором копий/вставок... или есть способ повторно использовать код из 1 источника?   -  person jaybny    schedule 21.06.2011
comment
Вы уверены, что RemoteLargeSimulatorClient является UDPClient? Возможно, вам следует использовать композицию вместо этого.   -  person empi    schedule 21.06.2011


Ответы (6)


Вы можете использовать только один базовый класс в C#. Однако вы можете реализовать столько интерфейсов, сколько захотите. Объедините этот факт с появлением методов расширения, и вы получите (хакерский ) обходной путь.

person Brandon Moretz    schedule 21.06.2011

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

Вы можете выбрать только один класс для наследования, а остальные сделать интерфейсами или просто сделать их все интерфейсами.

Вы также можете связать свое наследование следующим образом:

class UDPClient
{
}

class LargeSimulator : UDPClient
{
}

class RemoteLargeSimulatorClient : LargeSimulator
{
}
person Neil N    schedule 21.06.2011

Чтобы получить множественное наследование так, как вы этого хотите, вам нужно сделать ваш UDPClient и LargeSimulator interface вместо class.

Множественное наследование классов невозможно в С#

person Tony The Lion    schedule 21.06.2011

Одной из возможных замен множественного наследования являются миксины. К сожалению, в C# их тоже нет, но возможны обходные пути. Большинство полагаются на использование методов расширения (как предложил предыдущий ответчик). См. следующие ссылки:

http://mortslikeus.blogspot.com/2008/01/emulatory-mixins-with-c.html http://www.zorched.net/2008/01/03/implementing-mixins-with-c-extension-methods/ http://colinmackay.co.uk/blog/2008/02/24/mixins-in-c-30/

person daveaglick    schedule 21.06.2011

Краткий ответ: множественное наследование не допускается в C#. Ознакомьтесь с интерфейсами: http://msdn.microsoft.com/en-us/library/ms173156.aspx

Немного более длинный ответ: возможно, вам подойдет какой-нибудь другой шаблон проектирования, например шаблон стратегии и т. д. Наследование — не единственный способ добиться повторного использования кода.

person FishBasketGordo    schedule 21.06.2011

interface ILARGESimulator
{
}

interface IUDPClient
{
}

class UDPClient : IUDPClient
{
}

class LargeSimulator : ILARGESimulator
{
}

class RemoteLargeSimulatorClient : IUDPClient, ILargeSimulator
{
    private IUDPClient client = new UDPClient();
    private ILARGESimulator simulator = new LARGESimulator();

}

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

person Marino Šimić    schedule 21.06.2011
comment
LargeSimulator имеет 100 000 событий и методов (из внешней библиотеки) ... UDPClient имеет низкоуровневые сетевые материалы ... мне нужно выбрать 1 и скопировать и вставить? кажется смешным .. для настоящего языка - person jaybny; 21.06.2011
comment
Просто не используйте это. Кажется, вам не нужен объект, который объединяет оба в один. Кажется, это излишество, чтобы присоединиться к чему-то такому большому. Возможно, в игре отсутствует какой-то шаблон дизайна. - person Marino Šimić; 21.06.2011
comment
@jaybny, если бы вы рассказали нам больше о том, что вы пытаетесь сделать, мы могли бы помочь вам лучше. Похоже, что SOLID и композиция принесут вам больше пользы, чем интерфейсы, наследование и нытье о том, что C# — это просто копипаст. :) - person bzlm; 21.06.2011