2009-08-28 29 views
40

Bu konuda boş bir çizim yapıyorum ve yazdığım daha önceki bir örneği bulamıyorum. Bir sınıfla genel bir arayüz uygulamaya çalışıyorum. Arabirimi uyguladığımda, bir şeyin doğru çalışmadığını düşünüyorum çünkü Visual Studio sürekli olarak Genel Arabirim'deki tüm yöntemleri kullanmıyorum diyerek hatalar üretir.Bir Arabirimi Genel Yöntemlerle Uygulayın

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

Peki benim sınıf gibi görünmelidir:

İşte Birlikte çalıştığım şeyi bir saplama var?

+1

Yanlış soru başlığını. Normal sınıflar ve arayüzlerde genel yöntemler vardır ve yöntemleri ile genel arayüzler vardır. – Kobor42

cevap

69

Çok gibi, arabirime yeni bir biçim olmalıdır:

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

Sonra genel bir sınıf olarak bunu uygulayabilirsiniz:

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

Veya, somut olarak uygulayabilirsiniz:

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

Mükemmel. Jenerik varsları belirtmem gerektiğini biliyordum ama nerede olduğunu hatırlamıyordum (cezalandırılmadı).Teşekkürler Reed! –

+1

İstenen sonuç mümkün olmayabilir, ancak IMO'nun bu yanıtı genel yöntemlere sahip değil, bağımlı yöntemlere sahip genel bir sınıf var. Teknik olarak, genel yöntemlerin kendi şablon parametrelerine sahip olacağı görülmektedir. – Catskul

+0

Haklısınız. Yanlış soru başlığı, ama soruya iyi cevap. – Kobor42

9

ben muhtemelen bu gibi arayüzü yeniden tanımlamak istediğiniz düşünüyorum:

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

Sana yöntemleri (yeniden kullanım), beyan olduğunuz jenerik arayüzünün genel parametreleri kullanmak istiyorum düşünüyorum; ve muhtemelen kendilerine (arabirimden farklı) genel parametrelerle genel yöntemler yapmak istemezsiniz.

bunu yeniden tanımlandı olarak arayüzü, böyle bir sınıf tanımlayabilirsiniz Verilen:

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

Ya da bu gibi genel bir sınıf tanımlayın:

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

Bunu genel bir sınıf olarak da uygulayabilirsiniz, örn .: Foo : IOurTemplate - Jason'ın hangi seçenek olduğundan emin değilim. –

+0

Haklısın, bunu ekleyeceğim. – ChrisW

1

- düzenle

Diğer cevaplar daha iyidir, ancak nasıl görünmesi gerektiği konusunda kafanız karıştığında VS'nin sizin için arabirimi uygulayabileceğini unutmayın.

Aşağıda açıklanan işlem. Tek yaptığım yazma arayüzü, daha sonra VS oluşturmak için açılır için üzerine tıklayın ve küçük simge için beklemek olduğunu

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 
} 

Not:

Eh, Visual Studio bu gibi görünmelidir söylüyor Benim için uygulama :)

+0

Bakınız: 'T' ve 'U' arabiriminde (her ikisi de 'dize') uzmanlaşmanıza rağmen, yöntemler kendileri ayrı/ayrı genel parametrelerle geneldir. niyetindeydi. – ChrisW

+0

Katılıyorum, tavsiyenizin iyi olduğunu düşünüyorum, sadece nasıl göründüğüyle ilgili kafa karıştırıyorsanız, VS'nin sizin için arabirimi nasıl uygulayabileceğini gösterdim. –

İlgili konular