2010-07-23 173 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,为什么它不能作为参数传递?

在Date和Online类之间添加ICalendarView和CalendarPresenter之前,此工作正常,但我需要它,以便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'作为Calendar Calendar Server的类型参数,但调用构造函数的实例为class Bar:ICalendarView,该实例与基类OnlinePresenter中的T不匹配'(也就是'Foo')。 – 2010-07-23 16:56:30

+0

+1。我以为我应该能够使用接口,因为我指定它必须是ICalendarView类型。感谢您的澄清。 – Brandon 2010-07-23 17:08:34

相关问题