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.
+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'). –
+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