2010-07-23 3 views
1

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

У меня есть 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 мог обрабатывать отображение календаря и может быть унаследован от других ведущих.

ответ

4

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

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

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

+1

+1. В противном случае вы могли бы предоставить 'class Foo: ICalendarView' в качестве параметра типа CalendarPresenter ', но вызовите конструктор с экземпляром 'class Bar: ICalendarView', который не будет соответствовать' T' в базовом классе 'OnlinePresenter '(то есть' Foo'). –

+0

+1. Я думал, что должен был использовать интерфейс, так как я указал, что он должен быть типа ICalendarView. Спасибо за разъяснения. – Brandon

Смежные вопросы