public interface IBasePresenter
{
}
public interface IJobViewPresenter : IBasePresenter
{
}
public interface IActivityViewPresenter : IBasePresenter
{
}
public class BaseView
{
public IBasePresenter Presenter
{
get;
set;
}
}
public class JobView : BaseView
{
public IJobViewPresenter JobViewPresenter
{
get { this.Presenter as IJobViewPresenter;}
}
}
public class ActivityView : BaseView
{
public IActivityViewPresenter ActivityViewPresenter
{
get { this.Presenter as IActivityViewPresenter;}
}
}
Позволяет предполагают, что мне нужно свойство IBasePresenter на BaseView. Теперь это свойство наследовано JobView и ActivityView, но если мне нужна ссылка на объект IJobViewPresenter в этих производных классах затем, я должен ввести свойство IBasePresenter броска к IJobViewPresenter или IActivityPresenter (которого я хочу избежать), или создайте JobViewPresenter и ActivityViewPresenter на производных классах (как показано выше).
Я хочу избежать преобразования типа в производных классах и все еще иметь ссылку на IJobViewPresenter или IActivityViewPresenter и все еще иметь IBasePresenter в BaseView.
Существует ли способ, которым я могу достигнуть его?
Вы можете сделать следующее:
public class BaseView<TPresenter>
where TPresenter: IBasePresenter
{
TPresenter Presenter { get; set; }
}
public class JobView: BaseView<IJobViewPresenter>
{
}
Если у вас есть код, которому нужно ссылаться на BaseView, вы можете создать интерфейс и выставить базовый презентер следующим образом:
public interface IBaseView
{
IBasePresenter BasePresenter { get; }
}
public class BaseView<TPresenter> : IBaseView
where TPresenter: IBasePresenter
{
TPresenter Presenter { get; set; }
IBasePresenter IBaseView.BasePresenter
{
get { return Presenter; }
}
}
Классы, которым нужен доступ к BaseView, теперь могут потреблять интерфейс вместо BaseView напрямую. Там же можно разместить любые другие базовые сервисы, которые необходимо потреблять.
Это работа для полиморфизма.
public interface IBasePresenter
{
}
public interface IJobViewPresenter : IBasePresenter
{
}
public interface IActivityViewPresenter : IBasePresenter
{
}
public class BaseView : IBasePresenter
{
}
public class JobView : BaseView, IJobViewPresenter
{
}
public class ActivityView : BaseView, IActivityViewPresenter
{
}