2010-08-13 2 views
6

Как я работаю разработчиком C#, я знаю, что мы можем реализовать multiple inheritance с помощью Interface.Множественное наследование в C#

Может ли кто-нибудь указать мне ссылку или код, как достичь multiple inheritance с C#.

Я хочу код для достижения множественного наследования в C# с использованием Interface.

Заранее спасибо.

+8

В C# вы можете реализовать несколько интерфейсов, но вы можете наследовать только один класс. – 7wp

+11

Когда реализация нескольких интерфейсов стала равной множественному «наследованию»? Реализация и наследование - это две совершенно разные вещи. –

+0

@ Хасан: не «полностью», наследующий от интерфейса, удовлетворяет принципу подстановки. –

ответ

7

Вот хороший пример.

http://blog.vuscode.com/malovicn/archive/2006/10/20/How-to-do-multiple-inheritance-in-C_2300_-2D00-Implementation-over-delegation-_2800_IOD_2900_.aspx

Быстрый код Предварительный просмотр:

interface ICustomerCollection 
{ 
     void Add(string customerName); 
     void Delete(string customerName); 
} 

class CustomerCollection : ICustomerCollection 
{ 
     public void Add(string customerName) 
     { 
      /*Customer collection add method specific code*/ 
     } 
     public void Delete(string customerName) 
     { 
      /*Customer collection delete method specific code*/ 
     } 
} 

class MyUserControl: UserControl, ICustomerCollection 
{ 
     CustomerCollection _customerCollection=new CustomerCollection(); 

     public void Add(string customerName) 
     { 
      _customerCollection.Add(customerName); 
     } 
     public void Delete(string customerName) 
     { 
      _customerCollection.Add(customerName); 
     } 
} 
12

Это не строго множественное наследование - но ваш C# класс может реализовать несколько интерфейсов, что это правильно:

public class MyClass : BaseClass, IInterface1, IInterface2, IInterface3 
{ 
    // implement methods and properties for IInterface1 
    .. 

    // implement methods and properties for IInterface2 
    .. 

    // implement methods and properties for IInterface3 
    .. 
} 

Вы должны обеспечить реализацию для всех методов (и свойств), определенных во всех интерфейсах, которые вы будете планировать внедрение.

Я не совсем понимаю, что вы ищете от вашего вопроса .... можете ли вы немного разъяснить? Что ты пытаешься сделать? Где у вас проблемы?

+0

Marc, Я хочу знать, как мы можем получить точное поведение в множественном наследовании с интерфейсом так же, как мы наследуем один класс. Хотелось бы также узнать, можем ли мы направить наш текущий объект другим классом с использованием интерфейса? (Может быть, это называется MH) – nunu

+7

вы ** не можете ** получить то же самое поведение с интерфейсами реализации, как с истинным множественным наследованием. Интерфейсы определяют только функциональный интерфейс - вы не можете наследовать от нескольких реализаций. Это приближение - не точная замена. –

+1

«строгое множественное наследование» не существует, однако существует некоторое мнение, что «строгий» означает множественное наследование реализации. По мере надобности * множественное наследование интерфейса * является просто еще одной формой множественного наследования, из которой существует множество форм (Мейер описывает 16 таких форм p824 + в OOSC). – Abel

2
class MyClass : IFirstInterface, ISecondInterface, IThirdInterface 
{ 
    // implement the methods of the interfaces 
} 
7

Реализация нескольких интерфейсов является НЕ замена множественного наследования. Интерфейсы должны указывать контракт, к которому будет придерживаться класс. Больше похоже на абстрактные классы.

Если вы хотите добиться эффекта множественного наследования, то вам может помочь реализация Composite Pattern.

1

Тогда это наследование от более чем одного интерфейса:

class EmptyClass : IDoSomething, IDoSomethingElse 
{ 
} 
interface IDoSomething 
{ 
} 
interface IDoSomethingElse 
{ 
} 

static class InterfaceExtensions 
{ 
    public static int DoSomething(this IDoSomething tThis) 
    { 
     return 8; 
    } 
    public static int DoSomethingElse(this IDoSomethingElse tThis) 
    { 
     return 4; 
    } 
} 

Использование методов расширения на интерфейс, вы можете иметь что-то более, как множественное наследование, чем просто лавировать интерфейсы на. Поскольку методы не являются частью определения интерфейса, вам также не нужно реализовывать их в классе, если вы этого не хотите. (Не совсем переопределяя их, вам нужна ссылка типа EmptyClass для их вызова, поскольку более конкретное или точное имя типа выигрывает по унаследованным типам.

Смежные вопросы