Дизайн, чтобы избежать приведения типов в производных классах? - PullRequest
5 голосов
/ 02 апреля 2010
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 в этих производных классах, тогда мне нужно ввести свойство cast IBasePresenter в IJobViewPresenter или IActivityPresenter (которого я хочу избежать) или создать JobViewPresenter и ActivityViewPresenter на производных классах (как показано выше).

Я хочу избежать приведения типов в производных классах и все еще иметь ссылку на IJobViewPresenter или IActivityViewPresenter, и при этом в BaseView по-прежнему есть IBasePresenter.

Есть ли способ, которым я могу этого достичь?

Ответы [ 2 ]

5 голосов
/ 02 апреля 2010

Вы можете сделать это:

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

0 голосов
/ 02 апреля 2010

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

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
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...