设计,避免在派生类的类型转换? [英] Design to avoid type casting in derived classes?

查看:141
本文介绍了设计,避免在派生类的类型转换?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

让我们假设,我需要对基本视点一个IBase的presenter财产。 现在,此属性是由工作视图和ActivityView继承,但如果我需要参考IJobView presenter对象在这些派生类的话,我需要键入投IBase的presenter属性IJobView presenter或IActivity presenter(这是我想避免),或在派生类创建工作视图presenter和ActivityView presenter(如上图所示)。

Lets assume that I need a IBasePresenter property on BaseView. Now this property is inherited by JobView and ActivityView but if I need reference to IJobViewPresenter object in these derived classes then I need to type cast IBasePresenter property to IJobViewPresenter or IActivityPresenter (which I want to avoid) or create JobViewPresenter and ActivityViewPresenter on derived classes (as shown above).

我想避免在派生类的类型转换,仍然有参考IJobView presenter或IActivityView presenter,仍然有IBase的presenter的基本视角。

I want to avoid type casting in derived classes and still have reference to IJobViewPresenter or IActivityViewPresenter and still have IBasePresenter in BaseView.

有没有一种方法可以让我实现它?

Is there a way I can achieve it ?

推荐答案

你可以这样做:

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

    public class JobView: BaseView<IJobViewPresenter>
    {

    }


如果您有需要引用基本视点code,你可以创建一个接口和揭露基地presenter是这样的:


If you have code that needs to reference BaseView, you can create an interface and expose the base presenter like this:

    public interface IBaseView
    {
        IBasePresenter BasePresenter { get; }
    }

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

        IBasePresenter IBaseView.BasePresenter
        {
            get { return Presenter; }
        }
    }

这需要访问基本视点现在可以直接使用的接口,而不是基本视角类。您可以公开那些需要在那里被消耗任何其他基本服务也是如此。

Classes that need access to the BaseView can now consume the interface instead of BaseView directly. You can expose any other base services that need to be consumed in there as well.

这篇关于设计,避免在派生类的类型转换?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆