2013-01-02 2 views
7

questo è qualcosa di veramente semplice, sono sicuro, ma sto lottando per capire la malaria ereditaria quando si tratta di interfaccia.C# metodo generico con ereditarietà e interfaccia

Date le seguenti classi, come faccio a interfacciare il metodo Get in un'interfaccia specifica per la classe Parent, senza sovrascrivere il metodo base?

public class Base<T, T2> 
{ 
    public T Get<T, T2>(string key) 
    { 
     ... 
    } 
} 

public class Parent : Base<Type1, Type2>, IParent 
{ 
    ... 
} 

Ecco quello che ho atm, ma io continuo a ricevere un "membro inteface Type1 IParent.Get (stringa) non è implementata" errore.

public interface IParent 
{ 
    Type1 Get(string key); 
} 
+1

Non è necessario il 'Get ' nel metodo se sono già dichiarati nella classe. – ja72

+0

Grazie per tutti i commenti, mi ha aiutato a capirlo molto meglio.ja72, Krizz, Charles e Guvante hanno tutti colpito il chiodo sulla testa, ma la descrizione di Charles è stata la più approfondita (con esempi di codice, non meno), così ottiene il segno di spunta verde :) – beterthanlife

risposta

2

Il metodo T Get<T,T2>(string) di Base<T,T2> e il metodo Type1 Get(string) metodo IParent sono due diverse firme di metodo. Dovresti implementare entrambi. Se si voleva entrambe le implementazioni di utilizzare la stessa funzionalità si potrebbe procedere come segue:

public class ParentJ : Base<Type1, Type2>, IParent { 
public Type1 Get(string key) { 
    return this.Get<Type1,Type2>(key); 
} 
} 

Tuttavia credo che il tuo intento originale non è quello di parametrizzare il metodo Get() in Base<T,T2> quindi si può scrivere Base in questo modo:

public class Base<T,T2> { 
    public T Get(string key) { 
    // implementation here 
    } 
} 

Tale firma soddisfa la firma del metodo in IParent.

Sono necessari solo i parametri di tipo (ad esempio T e T2) sui metodi quando il tipo non può o non deve essere desunto dalla classe che contiene il metodo.

5

public T Get<T, T2>(string key) creerà un metodo generico su classe generica. T e T2 saranno argomenti di questo metodo generico e non avranno alcuna relazione con la classe T e T2.

Basta fare public T Get(string key).

2

Quando si confrontano i metodi, questa firma deve corrispondere esattamente. Uno dei componenti della firma è il numero di argomenti generici.

L'interfaccia IParent contiene un metodo Get con argomenti di tipo zero. La classe Base contiene un metodo Get con due argomenti di tipo.

Mentre sembra che Base.Get condivida gli argomenti di tipo, non lo fa, la sintassi utilizzata crea due nuovi argomenti di tipo che ombreggiano gli argomenti di tipo della classe.

La correzione è implementare semplicemente un metodo Get in Parent che non ha argomenti di tipo.

1

Prova questo. Non si esegue l'override della base Get e si implementa IParent.

public class Type1 { } 
public class Type2 { } 

public interface IParent 
{ 
    Type1 Get(string key); 
} 

public class Base<T, T2> 
{ 
    public T Get(string key) 
    { 
     return default(T); 
    } 
} 
public class Parent : Base<Type1, Type2>, IParent 
{ 
} 
0

provare utilizzando l'interfaccia IParent generica.