2009-08-28 14 views
40

Rysuję puste miejsce na tym i nie mogę znaleźć żadnego poprzedniego przykładu, który napisałem. Próbuję zaimplementować ogólny interfejs z klasą. Kiedy implementuję interfejs, myślę, że coś nie działa poprawnie, ponieważ Visual Studio nieustannie generuje błędy, mówiąc że nie wplatam wszystkich metod w Ogólny interfejs.Implementowanie interfejsu z metodami ogólnymi

Oto stub co pracuję z:

public interface IOurTemplate<T, U> 
{ 
    IEnumerable<T> List<T>() where T : class; 
    T Get<T, U>(U id) 
     where T : class 
     where U : class; 
} 

Więc co moja klasa powinna wyglądać?

+1

Błędna tytułowe pytanie. Istnieją ogólne metody w normalnych klasach i interfejsach, a także istnieją ogólne interfejsy z metodami. – Kobor42

Odpowiedz

69

należy przerobić interfejs, tak jak poniżej:

public interface IOurTemplate<T, U> 
     where T : class 
     where U : class 
{ 
    IEnumerable<T> List(); 
    T Get(U id); 
} 

Następnie można wdrożyć go jako ogólne klasy:

public class OurClass<T,U> : IOurTemplate<T,U> 
     where T : class 
     where U : class 
{ 
    IEnumerable<T> List() 
    { 
     yield return default(T); // put implementation here 
    } 

    T Get(U id) 
    { 

     return default(T); // put implementation here 
    } 
} 

Albo można wdrożyć go konkretnie:

public class OurClass : IOurTemplate<string,MyClass> 
{ 
    IEnumerable<string> List() 
    { 
     yield return "Some String"; // put implementation here 
    } 

    string Get(MyClass id) 
    { 

     return id.Name; // put implementation here 
    } 
} 
+0

Idealny. Wiedziałem, że muszę określić ogólne znaki, ale nie pamiętam, gdzie (nie gra słów przeznaczonych).Dzięki Reed! –

+1

Pożądany wynik może nie być możliwy, ale IMO w tej odpowiedzi nie ma ogólnych metod, ale raczej ogólna klasa z zależnymi metodami. Technicznie wydaje się, że ogólne metody miałyby własne parametry szablonu. – Catskul

+0

Masz rację. Błędny tytuł pytania, ale dobra odpowiedź na to pytanie. – Kobor42

9

myślę prawdopodobnie chcesz przedefiniować swój interfejs tak:

public interface IOurTemplate<T, U> 
    where T : class 
    where U : class 
{ 
    IEnumerable<T> List(); 
    T Get(U id); 
} 

Myślę, że chcesz użyć metody (re-use) ogólne parametry interfejsu rodzajowe, w których są one deklarowanej; i prawdopodobnie nie chcesz, aby były one generycznymi metodami z własnymi (odmiennymi od interfejsu) parametrami generycznymi.

Biorąc interfejs jak na nowo go, można zdefiniować klasę tak:

class Foo : IOurTemplate<Bar, Baz> 
{ 
    public IEnumerable<Bar> List() { ... etc... } 
    public Bar Get(Baz id) { ... etc... } 
} 

lub zdefiniować rodzajowe klasa tak:

class Foo<T, U> : IOurTemplate<T, U> 
    where T : class 
    where U : class 
{ 
    public IEnumerable<T> List() { ... etc... } 
    public T Get(U id) { ... etc... } 
} 
+0

Możesz również zaimplementować to jako klasę ogólną, tj .: klasa Foo : IOurTemplate - Nie jestem pewien, której opcji Jason był po. –

+0

Masz rację, dodam to. – ChrisW

1

- Edycja

inne odpowiedzi są lepsze, ale pamiętaj, że możesz zaimplementować interfejs dla VS, jeśli nie masz pojęcia, jak powinien wyglądać.

Proces opisany poniżej.

Dobrze, Visual Studio informuje mnie powinno to wyglądać tak:

class X : IOurTemplate<string, string> 
{ 
    #region IOurTemplate<string,string> Members 

    IEnumerable<T> IOurTemplate<string, string>.List<T>() 
    { 
     throw new NotImplementedException(); 
    } 

    T IOurTemplate<string, string>.Get<T, U>(U id) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

Zauważ, że wszystko zrobiłem było interfejs zapisu, a następnie kliknij na nim, i czekać na małą ikonę, aby popup mieć VS generowania realizacja dla mnie :)

+0

Zobacz: chociaż specjalizujesz się w interfejsie "T" i "U" (oba są "ciągami"), same metody są generyczne z ich własnymi oddzielnymi/różnymi parametrami generycznymi ... co prawdopodobnie nie jest tym, co OP zamierzony. – ChrisW

+0

Zgadzam się, myślę, że twoja rada jest dobra, właśnie pokazałem, jak można uzyskać VS, aby zaimplementował interfejs dla ciebie, jeśli nie masz pojęcia, jak to wygląda. –

Powiązane problemy