2010-07-23 5 views
1

제네릭에 대한 경험이 많지 않지만 누군가가 왜 이것이 작동하지 않는지 설명하고 작동 시키려면 어떻게해야합니까?왜이 인터페이스를 인수로 전달할 수 없습니까?

3 개의 인터페이스가 있습니다.

public interface IOnlineView 

public interface ICalendarView : IOnlineView 

public interface IDateView : ICalendarView 

는 다음 나는 CalendarPresenter 클래스에 base(view) 호출 ICalendarView가 CalendarPresenter에 IDateView 잘 작동 전달 T

을 입력 할당 할 수없는 것을 말한다 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) { } 
}  

을 가지고 있지만, 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. 그렇지 않으면'classFoo : ICalendarView'를 타입 파라미터로'CalendarPresenter '에 제공 할 수 있습니다.하지만'class Bar : ICalendarView' 인스턴스로 생성자를 호출하면 기본 클래스'OnlinePresenter '의'T'와 일치하지 않을 것입니다 '(즉,'Foo'). –

+0

+1. 내가 ICalendarView 유형이어야한다고 지정했기 때문에 인터페이스를 사용할 수 있었어야한다고 생각했습니다. 해명 해줘서 고마워. – Brandon

관련 문제