2013-01-02 12 views
7

To jest coś naprawdę prostego na pewno, ale staram się opanować dziedziczenie dziedzictwa, jeśli chodzi o interakcję.C# metoda generyczna z dziedziczeniem i interfejsem

Biorąc pod uwagę następujące klasy, jak połączyć metodę Get w interfejsie specyficznym dla klasy Parent, bez przesłonięcia metody bazowej?

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

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

Oto co mam atm, ale wciąż otrzymuję "członkiem inteface Type1 IParent.Get (string) nie jest realizowany" błąd.

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

Nie potrzebujesz "Get " w metodzie, jeśli są one już zadeklarowane w klasie. – ja72

+0

Dzięki za wszystkie komentarze, pomogło mi to zrozumieć to znacznie lepiej.ja72, Krizz, Charles & Guvante wszystko trafiło w sedno, ale opis Charlesa był najbardziej dogłębny (z przykładami kodu, nie mniej), więc dostaje zielony tyk :) – beterthanlife

Odpowiedz

2

Metoda T Get<T,T2>(string) z Base<T,T2> i metoda Type1 Get(string) według metody IParent to dwie różne sygnatury metod. Będziesz musiał zaimplementować oba. Jeśli chciał obie implementacje używać taką samą funkcjonalność można wykonać następujące czynności:

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

Jednak wierzę, że oryginalny intencją nie jest parametryzacji Sposób Base<T,T2>Get() dlatego byś napisać Base tak:

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

Podpis ten spełniałby sygnaturę metody z IParent.

Potrzebne są tylko parametry typu (np. T i T2) w przypadku metod, w których typ nie może lub nie powinien być wywnioskowany przez klasę zawierającą metodę.

5

public T Get<T, T2>(string key) utworzy ogólną metodę dla klasy ogólnej. T i T2 będą argumentami tej ogólnej metody i nie będą miały żadnego związku z klasami T i T2.

Po prostu zrób to public T Get(string key).

2

Podczas dopasowywania metod ten podpis musi być dokładnie taki sam. Jednym ze składników podpisu jest liczba ogólnych argumentów.

Twój interfejs IParent zawiera metodę Get z argumentami typu zerowego. Twoja klasa Base zawiera metodę Get z dwoma argumentami typu.

Chociaż wygląda na to, że Base.Get dzieli się swoimi argumentami typu, nie robi, użyta składnia tworzy dwa nowe argumenty typu, które zacieniają argumenty typu klasy.

Rozwiązaniem jest prosta implementacja metody Get w Parent, która nie ma żadnych argumentów typu.

1

Spróbuj tego. Nie zastępujesz bazy Get i implementujesz 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

Spróbuj za pomocą ogólnego interfejsu IParent.

Powiązane problemy