2010-08-13 11 views
6

Ponieważ pracuję jako programista C#, wiem, że możemy zaimplementować multiple inheritance przy użyciu Interface.Wiele dziedziczenia w C#

Czy ktoś może podać mi link LUB kod, jak uzyskać multiple inheritance z C#.

Chcę kod, jak uzyskać wiele dziedziczenia w C# przy użyciu Interface.

Z góry dziękuję.

+8

W języku C# można implementować wiele interfejsów, ale można dziedziczyć tylko z jednej klasy. – 7wp

+11

Kiedy wykonawcze wielu interfejsów stać równa wielokrotności „dziedziczenia” Wdrożenie i sieje to dwie zupełnie różne rzeczy –

+0

@Hasan:?. nie „całkowicie”, dziedziczenie z interfejsu spełnia zasada substytucji –

Odpowiedz

7

Oto dobry przykład.

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

Szybki podgląd kodu:

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

To nie jest ściśle wielokrotne dziedziczenie - ale twój # klasa C może implementować wiele interfejsów, to prawda:

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 
    .. 
} 

Trzeba zapewnić implementacje wszystkich metod (i właściwościach) zdefiniowanych we wszystkich interfejsów których przebywa planuje wdrożyć.

Nie jestem do końca jasny na to, czego szukasz ze swojego pytania .... czy możesz trochę wyjaśnić? Co próbujesz zrobić? Gdzie masz problemy?

+0

Marc, Chcę wiedzieć, w jaki sposób możemy uzyskać dokładne zachowanie w wielu dziedziczeniu z interfejsem, tak jak dziedziczymy jedną klasę. Chciałbyś również wiedzieć, czy możemy obsadzić obecny obiekt inną klasą za pomocą interfejsu? (Może to nazywać się MH) – nunu

+7

** nie można ** uzyskać dokładnie takiego samego zachowania przy implementowaniu interfejsów, co w przypadku prawdziwego dziedziczenia wielokrotnego. Interfejsy definiują jedynie funkcjonalny interfejs - nie można dziedziczyć z wielu implementacji. Jest to przybliżenie, a nie dokładny zamiennik. –

+1

"ścisłe wielokrotne dziedziczenie" nie istnieje, jednak niektóre konsensus wydaje się, że "ścisły" oznacza dziedziczenie wielu dziedzin. Jak się okazuje, * dziedziczenie wielu interfejsów * to po prostu kolejna forma dziedziczenia wielokrotnego, z których istnieje wiele form (Meyer opisuje 16 takich form p824 + w OOSC). – Abel

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

Realizacja wielu interfejsów NIE zastąpienie wielokrotnego dziedziczenia. Interfejsy służą do określenia umowy, do której będzie się stosować klasa. Bardziej przypomina klasy abstrakcyjne.

Jeśli chcesz osiągnąć efekt wielokrotnego dziedziczenia, możesz pomóc w wykonaniu Composite Pattern.

1

Wtedy nie jest to do dziedziczenia z więcej niż jednego interfejsu:

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; 
    } 
} 

Stosując metody rozszerzenie na interfejsie można mieć coś bardziej jak wielokrotne dziedziczenie niż tylko interfejsy na sklejaniu. Ponieważ metody nie są częścią definicji interfejsu, nie musisz ich również implementować w klasie, chyba że chcesz. (Naprawdę nie ich zastąpienie, trzeba odniesienie typu EmptyClass nazywać ich od bardziej szczegółowych lub dokładnej nazwy typu, wygrywa dziedzicznych typów.

Powiązane problemy