Почему я не могу передать этот интерфейс в качестве аргумента? - PullRequest
1 голос
/ 23 июля 2010

У меня нет большого опыта работы с дженериками, но может кто-нибудь объяснить мне, почему это не работает и что мне нужно сделать, чтобы заставить его работать?

У меня 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 Ответ

4 голосов
/ 23 июля 2010

Внести следующие изменения:

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

Конструктор базового класса «OnlinePresenter» принимает объект типа T, а конструктор подкласса «CalendarPresenter» принимает объект типа «ICalendarView».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...