Дизайн для предотвращения преобразования типа в производных классах?

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.

Существует ли способ, которым я могу достигнуть его?

5
задан John Saunders 2 April 2010 в 18:56
поделиться

2 ответа

Вы можете сделать следующее:

    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 напрямую. Там же можно разместить любые другие базовые сервисы, которые необходимо потреблять.

5
ответ дан 14 December 2019 в 19:08
поделиться

Это работа для полиморфизма.

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
{
}
0
ответ дан 14 December 2019 в 19:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: