2010-08-13 2 views
6

Dato che sto lavorando come sviluppatore C#, so che possiamo implementare multiple inheritance utilizzando Interface.Eredità multipla in C#

Qualcuno può fornirci il collegamento O codice per ottenere multiple inheritance con C#.

Desidero codice su come ottenere l'ereditarietà multipla in C# con l'uso di Interface.

Grazie in anticipo.

+8

In C# è possibile implementare più interfacce, ma è possibile ereditare solo da una classe. – 7wp

+11

Quando implementare più interfacce diventa uguale a "ereditarietà" multiplo? Implementare ed ereditare sono due cose completamente diverse: –

+0

@Hasan: non "interamente", l'ereditarietà di un'interfaccia soddisfa il principio di sostituzione –

risposta

7

Ecco un buon esempio.

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

Un codice rapida anteprima:

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

Non è l'ereditarietà strettamente multipla - ma il vostro C# classe può implementare più interfacce, che è di destra:

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

È necessario fornire implementazioni per tutti i metodi (e proprietà) definiti in tutte le interfacce sei pianificazione per implementare.

Non sono abbastanza chiaro su cosa stai cercando dalla tua domanda .... puoi chiarire un po '?? Cosa stai cercando di fare? Dove ti trovi nei guai ??

+0

Marc, Voglio sapere che come potremmo ottenere un comportamento esatto nell'ereditarietà multipla con Interface proprio come ereditiamo una singola classe. Vorrei anche sapere che possiamo lanciare il nostro oggetto corrente con un'altra classe con l'uso di Interface? (Può essere chiamato MH) – nunu

+7

** non è possibile ** ottenere lo stesso identico comportamento con le interfacce di implementazione come con una vera ereditarietà multipla. Le interfacce definiscono solo un'interfaccia funzionale: non è possibile ereditare da più implementazioni. È un'approssimazione - non un sostituto esatto. –

+1

"strict multiple inheritance" non esiste, tuttavia un certo consenso sembra essere che "strict" significa ereditarietà multipla dell'implementazione. Come viene, * l'ereditarietà dell'interfaccia multipla * è solo un'altra forma di ereditarietà multipla, di cui esistono molte forme (Meyer descrive 16 tali moduli p824 + in OOSC). – Abel

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

implementazione più interfacce è NON una sostituzione di ereditarietà multipla. Le interfacce sono lì per specificare il contratto a cui una classe aderirà. Più come lezioni astratte.

Se si desidera ottenere gli effetti dell'ereditarietà multipla, l'implementazione di Composite Pattern può essere di aiuto.

1

Poi c'è questo per ereditare da più di un'interfaccia:

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

Utilizzando metodi di estensione per l'interfaccia si può avere qualcosa di più come l'ereditarietà multipla di una semplice virata le interfacce su. Poiché i metodi non fanno parte della definizione dell'interfaccia, non è necessario implementarli nella classe, a meno che non lo si voglia. (In realtà non è necessario sovrascriverli, è necessario un riferimento di tipo EmptyClass per chiamarli dal nome più specifico o esatto, vince su tipi ereditati.