2012-09-07 10 views
10

Ben şu sınıfları/arayüzleri:C# Jenerik Kısıtlama - Nasıl geçerli sınıf türü başvurmak için?

public abstract class AbstractBasePresenter<T> : IPresenter<T> 
    where T : class, IView 
{ 
} 

public interface IPresenter<T> 
{ 
} 

public interface IView<TV, TE, TP> : IView 
    where TV : IViewModel 
    where TE : IEditModel 
    //where TP : AbstractBasePresenter<???> 
{ 
} 

public interface IView {} 

Ben AbstractBasePresenter devralan bir sınıf olmaya IView <> üzerinde TP sınırlamak herhangi bir yolu var mı?

Ya kontrol dışı bir jenerik IPresenter arayüzü oluşturmak ve daha sonra IPresenter bunu uygulamaya güncellemek ve daha sonra kullanmak üzere benim tek alternatiftir "TP: IPresenter"?

public interface IInsuredDetailsView : IView<InsuredDetailsViewModel, InsuredDetailsEditModel, IInsuredDetailsPresenter> 
{ } 

public interface IInsuredDetailsPresenter : IPresenter<IInsuredDetailsView> 
{ } 

Derleyici IInsuredDetailsPresenter atanabilir olmadığını yakınır:

Teşekkür

Güncelleme:

aşağıda

Önerilen cevap çalışmaz: olarak

public interface IView<TV, TE, TP> : IView 
where TV : IViewModel 
where TE : IEditModel 
where TP : AbstractBasePresenter<IView<TV,TE,TP>> 
{ 
} 

Ben arayüz ilan ettiler SoyutBasePresenter>

+0

'AbstractBasePresenter'? C# bazı türü parametreleri ayarlamak edilmemiş yapılan jenerik tiplerinin örneklerini kavramı yok. –

+0

'nerede TP: AbstractBasePresenter >' derler ama istediğini o sonucu sağlayacaktır emin değilim ... Bir not olarak – nemesv

+1

aşağıdaki yapı overcomplicated olduğunu ve olabileceğini anlamak zordur için yararlı. – Andrey

cevap

2

Bunu yapabilirsin, ama IView<> arayüzüne bir daha tip argüman sağlamak gerekir: sorunuzu sürümleri göre

:

public interface IView<TV, TE, TP, T> : IView 
    where TV : IViewModel 
    where TE : IEditModel 
    where TP : AbstractBasePresenter<T> 
    where T : class, IView 
{ 
} 

Düzenleme IInsuredDetailsPresenter kesinlikle atanamama AbstractBasePresenter. Derleyici, orijinal sorunuzda talep ettiğiniz kısıtlama nedeniyle şikayet ediyor. Daha spesifik olarak bu bölümünde

where TP : AbstractBasePresenter<T> 

için görünüyor nedeniyle siz de bir arayüz olarak TP sınırlamak istiyorum. Sen kod aşağıda parçası deneyebilirsiniz: T üzerine

public interface IView<TV, TE, TP, T> : IView 
    where TV : IViewModel 
    where TE : IEditModel 
    where TP : IPresenter<T> 
{ 
} 

Kısıtlamalar artık ihtiyaç vardır, IPresenter<T> hiçbiri yoktur çünkü. Elbette, armen.shimoon'un cevabını benzer şekilde uyarlayabilirsiniz. nokta IPresenter<T> kısıtlaması ile AbstractBasePresenter<T> kısıtlamayı değiştirmektir.

+0

Kodunuz derlenmiyor. Şu anda bir T eksiksiniz: T: IView – nemesv

+0

@nemesv: Doğru, teşekkürler – pbalaga

+0

Dördüncü genel parametreyi eklemeniz gerektiğini düşünmüyorum. –

4

Sorun değil, başka jenerik parametre için gerek:

: Eğer AbstractBasePresenter devralmak için sunumu gerekmiyorsa

, kod değiştirin:

public interface IView<TV, TE, TP> : IView 
    where TV : IViewModel 
    where TE : IEditModel 
    where TP : AbstractBasePresenter<IView<TV,TE,TP>> 
{ 
} 

Düzenleme: Güncelleme soru ne 'T ile

public interface IView<TV, TE, TP> : IView 
    where TV : IViewModel 
    where TE : IEditModel 
    where TP : IPresenter<IView<TV,TE,TP>> 
{ 
} 
+0

Sonuna kadar güçlü bir şekilde yazılan desteğin gerekmediği için çözümünüz iyidir. (Hangi türün tam olarak "T", "AbstractBasePresenter" içinde olduğunu kontrol edemezsiniz.) – pbalaga

+1

Bu çalışmaz. Yukarıdaki düzenlenmiş soruya bakın. – Rezler

İlgili konular