2009-11-04 18 views
6

Mam 2 interfejsy bazowe, IViewBase (które wszystkie widoki wdroży) i IPresenterBase (które wszystkie prezenterzy wdroży):Interfejs Pochodzące z członka interfejsu pochodzi

public interface IViewBase { } 

public interface IPresenterBase 
{ 
    IViewBase View { get; set; } 
} 

Potem stworzyłem nowy interfejs, który ILogPresenter wywodzi IPresenterBase i ILogView wynikające z IViewBase:

public interface ILogPresenter : IPresenterBase { } 

public interface ILogView : IViewBase{ } 

podczas tworzenia klasy, który implementuje ILogPresenter,

public class LogPresenter: ILogPresenter 
{ 
    public ILogView View { get; set; } 
} 

Występuje błąd:

"LogPresenter" nie implementuje członka interfejsu "IPresenterBase.View". "LogPresenter.View" nie może zaimplementować "IPresenterBase.View", ponieważ nie ma zgodnego typu zwrotu "Views.IViewBase".

Nie mogę ustawić typu zwrotu LogPresenter.View na ILogView, który pochodzi z IViewBase? Chciałbym wdrożyć ILogPresenter z innym IView, który wywodzi się z IViewBase.

Odpowiedz

9

Prawdopodobnie chcesz użyć rodzajowych tutaj:

public interface IViewBase { } 

public interface IPresenterBase<T> where T : IViewBase 
{ 
    T View { get; set; } 
} 

następnie:

public interface ILogPresenter : IPresenterBase<ILogView> { } 

public interface ILogView : IViewBase{ } 

Oprócz kowariantna typów powrotu nie są obsługiwane w języku C# (co mogłoby spowodować problemy nawet tylko z getter) masz podstawowy problem w oryginale. Mogłem zrobić:

IPresenterBase foo = new LogPresenterImpl(); 
foo.View = new SomeOtherView(); 

gdzie SomeOtherView realizowane IVewBase ale nie ILogView. Jak byś się spodziewał, że twój majątek sobie z tym poradzi?

Powyższa ogólna wersja rozwiązuje ten problem, umożliwiając prezenterowi wyrażenie rodzaju prezentowanego widoku.

2

Można to zrobić z rodzajowych:

public interface IViewBase { } 

public interface IPresenterBase<T> where T : IViewBase 
{ 
    T View { get; set; } 
} 

public interface ILogPresenter : IPresenterBase<ILogView> { } 

public interface ILogView : IViewBase { } 

public class LogPresenter : ILogPresenter 
{ 
    public ILogView View { get; set; } 
} 
Powiązane problemy