2010-07-23 4 views
1

Je n'ai pas beaucoup d'expérience avec les génériques, mais quelqu'un peut-il m'expliquer pourquoi cela ne fonctionne pas et ce que je dois faire pour que ça marche?Pourquoi ne puis-je pas passer cette interface en argument?

J'ai 3 interfaces.

public interface IOnlineView 

public interface ICalendarView : IOnlineView 

public interface IDateView : ICalendarView 

Puis j'ai 3 classes de présentateur

public abstract class OnlinePresenter<T> where T : IOnlineView 
{ 
    protected OnlinePresenter(T view) { } 
} 

public class CalendarPresenter<T> : OnlinePresenter<T> where T : ICalendarView 
{ 
    public CalendarPresenter(ICalendarView view) : base(view) { } 
}  

public class DatePresenter<T> : CalendarPresenter<IDateView> 
{ 
    public DatePresenter(IDateView view) : base(view) { } 
}  

L'appel base(view) sur la classe CalendarPresenter dit que ICalendarView est incessible à taper T

Passer le IDateView au CalendarPresenter fonctionne très bien, mais passer ICalendarView au OnlinePresenter ne fonctionne pas. Est-ce que je manque quelque chose? Si ICalendarView hérite de IOnlineView, pourquoi ne peut-il pas être passé en argument? Cela a fonctionné correctement avant que j'ajoute ICalendarView et CalendarPresenter entre les classes Date et Online, mais j'en ai besoin pour que CalendarPresenter puisse gérer l'affichage du calendrier et puisse être hérité des autres présentateurs.

Répondre

4

Faire le changement suivant:

public class CalendarPresenter<T> : OnlinePresenter<T> where T : ICalendarView 
{ 
    public CalendarPresenter(T view) : base(view) { } 
} 

La classe de base constructeur « OnlinePresenter » prend un objet de type T et la sous-classe constructeur « CalendarPresenter » a un objet de type « ICalendarView ».

+1

+1. Sinon, vous pouvez fournir 'class Foo: ICalendarView' comme paramètre de type à' CalendarPresenter ', mais appeler le constructeur avec une instance de' class Bar: ICalendarView', qui ne correspondrait pas à 'T' dans la classe de base' OnlinePresenter '(c'est-à-dire' Foo'). –

+0

+1. Je pensais que j'aurais dû être capable d'utiliser l'interface puisque j'ai spécifié qu'il devait être de type ICalendarView. Merci pour la clarification. – Brandon

Questions connexes