2010-07-23 386 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

相關問題