设计以避免派生类中的类型转换?

Dee*_*pak 5 .net c# design-patterns

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;}
    }
}
Run Code Online (Sandbox Code Playgroud)

让我们假设我需要在BaseView上使用IBasePresenter属性.现在这个属性是由JobView和ActivityView继承的,但是如果我需要在这些派生类中引用IJobViewPresenter对象,那么我需要输入转换IBasePresenter属性到IJobViewPresenter或IActivityPresenter(我想避免)或者在派生类上创建JobViewPresenter和ActivityViewPresenter(如如上所示).

我想避免在派生类中进行类型转换,仍然引用IJobViewPresenter或IActivityViewPresenter,并且在BaseView中仍然有IBasePresenter.

有没有办法实现它?

Dan*_*ant 5

你可以这样做:

    public class BaseView<TPresenter>
        where TPresenter: IBasePresenter
    {
        TPresenter Presenter { get; set; }
    }

    public class JobView: BaseView<IJobViewPresenter>
    {

    }
Run Code Online (Sandbox Code Playgroud)

如果您有需要引用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; }
        }
    }
Run Code Online (Sandbox Code Playgroud)

需要访问BaseView的类现在可以直接使用接口而不是BaseView.您也可以公开需要在其中使用的任何其他基本服务.