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

标签 c# .net 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;}
    }
}

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

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

有什么办法可以实现吗?

最佳答案

你可以这样做:

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

    public class JobView: BaseView<IJobViewPresenter>
    {

    }

如果你有代码需要引用BaseView,你可以像这样创建一个接口(interface)并公开base presenter:

    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 的类现在可以使用接口(interface)而不是直接使用 BaseView。您也可以公开需要在其中使用的任何其他基础服务。

关于c# - 设计以避免派生类中的类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2567957/

相关文章:

c# - iTextPdf 如何分页

.net - WPF数据虚拟化问题

oop - 是否使用 has-a(组合)或 is-a(继承)对汽车对象(及其部件,如引擎)进行建模?

design-patterns - 避免服务和 DI 的循环引用

c# - 存储查找值的最佳方式

c# - 并非所有代码路径都返回值 ' '

c# - 为初始加载编译后的 ASP.Net MVC 切换文化

.net - 为什么 LINQ to SQL 的性能比直接 SQL 查询更好?

c# - 无法将 Statement Lambda 放入 LINQ 查询中

design-patterns - REST API 登录模式