У меня нет большого опыта работы с дженериками, но кто-то может объяснить мне, почему это не работает и что мне нужно сделать, чтобы заставить его работать?Почему я не могу передать этот интерфейс в качестве аргумента?
У меня есть 3 интерфейса.
public interface IOnlineView
public interface ICalendarView : IOnlineView
public interface IDateView : ICalendarView
Тогда у меня есть 3 презентаторов классов
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) { }
}
base(view)
вызова на классе CalendarPresenter говорит, что ICalendarView не присваиваемый типа T
Проходя мимо IDateView к CalendarPresenter работает отлично, но передача ICalendarView в OnlinePresenter не делает. Я что-то упускаю? Если ICalendarView наследует от IOnlineView, почему он не может быть передан в качестве аргумента?
Это сработало до того, как я добавил ICalendarView и CalendarPresenter между классами Date и Online, но мне это нужно, чтобы CalendarPresenter мог обрабатывать отображение календаря и может быть унаследован от других ведущих.
+1. В противном случае вы могли бы предоставить 'class Foo: ICalendarView' в качестве параметра типа CalendarPresenter', но вызовите конструктор с экземпляром 'class Bar: ICalendarView', который не будет соответствовать' T' в базовом классе 'OnlinePresenter '(то есть' Foo'). –
+1. Я думал, что должен был использовать интерфейс, так как я указал, что он должен быть типа ICalendarView. Спасибо за разъяснения. – Brandon