2012-09-07 8 views
10

Mam następujących klas/interfejsów:C# Ogólne ograniczenia - jak odnosić się do obecnego typu klasy?

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

Czy jest jakiś sposób, że mogę zmusić TP na iVIEW <> być klasa, która dziedziczy z AbstractBasePresenter?

Czy jest to moja jedyna alternatywa, aby utworzyć nietypowy interfejs IPresenter, a następnie zaktualizować aplikację IPresenter w celu jej wdrożenia, a następnie użyć opcji "TP: IPresenter"?

Dzięki

Aktualizacja:

Proponowana odpowiedź poniżej nie działa:

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

Mam interfejs zadeklarowane jako:

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

public interface IInsuredDetailsPresenter : IPresenter<IInsuredDetailsView> 
{ } 

Kompilator narzeka, że ​​IInsuredDetailsPresenter nie jest przypisane do AbstractBasePresenter>

+0

'AbstractBasePresenter' z czym' T'? C# nie ma koncepcji wystąpień typów ogólnych, dla których niektóre parametry nie zostały ustawione. –

+0

'gdzie TP: AbstractBasePresenter >' kompiluje, ale nie jestem pewny, że dostarczy wynik czego chcesz ... – nemesv

+1

Uwaga: poniższa struktura jest zbyt skomplikowana i ciężko jest zrozumieć, co to może być użyteczny do. – Andrey

Odpowiedz

2

Można to zrobić, ale musisz podać jeden rodzaj argumentu do interfejsu IView<>:

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

Edit:

Według edycjach w swoim pytaniu: IInsuredDetailsPresenter na pewno nie jest przypisywany do AbstractBasePresenter. Kompilator narzeka ze względu na ograniczenia, o które prosiłeś w pierwotnym pytaniu. Dokładniej powodu tej części

where TP : AbstractBasePresenter<T> 

Wydaje chcesz ograniczyć TP się interfejs, jak również. Możesz spróbować poniższy fragment kodu: nie więcej są potrzebne

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

Ograniczenia T, ponieważ IPresenter<T> ma żadnego. Oczywiście, możesz dostosować odpowiedź armen.shimoon w podobny sposób. Chodzi o to, aby zastąpić ograniczenie AbstractBasePresenter<T> z ograniczeniem IPresenter<T>.

+0

Twój kod nie kompiluje się. Brakuje 'where T: IView' – nemesv

+0

@ saturesv: True, dzięki – pbalaga

+0

Nie sądzę, że musisz dodać czwarty parametr ogólny. –

4

Nie ma problemu, nie ma potrzeby innego parametru rodzajowego:

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

Edycja: Zaktualizowany pytanie:

Jeśli nie trzeba prezenterowi dziedziczyć z AbstractBasePresenter, zmień kod do:

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

Twoje rozwiązanie jest dobre, biorąc pod uwagę, że silnie napisana obsługa w pełnym zakresie nie jest potrzebna. (Nie masz kontroli nad tym, jaki typ to dokładnie 'T' w' AbstractBasePresenter'.) – pbalaga

+1

To nie działa. Zobacz edytowane pytanie powyżej. – Rezler

Powiązane problemy