2009-11-04 4 views
6

У меня есть 2 базовые интерфейсы, IViewBase (что все мнения будут осуществлять) и IPresenterBase (которые все ведущие будут осуществлять):производный интерфейс с элементом интерфейса, полученный

public interface IViewBase { } 

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

Затем я создал новый интерфейс ILogPresenter что происходит от IPresenterBase и ILogView вытекающих из IViewBase:

public interface ILogPresenter : IPresenterBase { } 

public interface ILogView : IViewBase{ } 

Когда я создать класс, который реализует ILogPresenter,

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

Я получаю ошибку:

«LogPresenter» не реализует интерфейсный элемент «IPresenterBase.View». «LogPresenter.View» не может реализовать «IPresenterBase.View», потому что у него нет соответствующего типа возврата «Views.IViewBase».

Я не могу установить возвращаемый тип LogPresenter.View для ILogView, который происходит из IViewBase? Я хотел бы реализовать ILogPresenter с другим IView, который происходит от IViewBase.

ответ

9

Вы, вероятно, хотите использовать дженерики здесь:

public interface IViewBase { } 

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

затем:

public interface ILogPresenter : IPresenterBase<ILogView> { } 

public interface ILogView : IViewBase{ } 

Помимо ковариантных типов возврата не поддерживаются в C# (что может вызвать проблемы даже просто с геттер) у вас есть фундаментальная проблема в оригинале. Я мог бы сделать:

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

где SomeOtherView реализован IVewBase но не ILogView. Как бы вы ожидали, что ваша собственность справится с этим?

Общая версия, приведенная выше, разрешает это, позволяя докладчику выразить, какой вид представления он представляет.

2

Вы можете сделать это с дженериков:

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; } 
}