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

C# 设计以避免派生类中的类型转换?,c#,.net,design-patterns,C#,.net,Design Patterns,假设我需要BaseView上的IBasePresenter属性。 现在此属性由JobView和ActivityView继承,但如果我需要在这些派生类中引用IJobViewPresenter对象,则需要将IbasPresenter属性强制转换为IJobViewPresenter或IActivityPresenter(我希望避免),或在派生类上创建JobViewPresenter和ActivityViewPresenter(如上所示) 我希望避免在派生类中进行类型转换,并且仍然具有对IJobView

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

我希望避免在派生类中进行类型转换,并且仍然具有对IJobViewPresenter或IActivityViewPresenter的引用,并且在BaseView中仍然具有IBasePresenter

有什么方法可以实现吗?

您可以这样做:

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;}
    }
}
公共类基本视图
其中TPresenter:IBasePresenter
{
TPresenter演示程序{get;set;}
}
公共类JobView:BaseView
{
}

如果您有需要引用BaseView的代码,则可以创建一个接口并公开基本演示者,如下所示:

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

    public class JobView: BaseView<IJobViewPresenter>
    {

    }
IBaseView公共接口
{
IBasePresenter BasePresenter{get;}
}
公共类BaseView:IBaseView
其中TPresenter:IBasePresenter
{
TPresenter演示程序{get;set;}
IBasePresenter IBaseView.BasePresenter
{
获取{return Presenter;}
}
}

需要访问BaseView的类现在可以直接使用接口而不是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; }
        }
    }

你可以,但没有必要,因为接口彼此继承。@Steven,你能澄清一下你的意思吗?我认为问题在于如何以其派生形式公开接口,这样就可以清楚地看到JobView的演示者始终是IJobViewPresenter(而不仅仅是在正确使用将始终保持其为IJobViewPresenter的假设下铸造的)。很好的解决方案。。。我喜欢。。谢谢,如果有两个类返回两个演示者,那么就这样做,不要假装是面向对象的。不要继承任何东西。我只想说,我认为你提供了一个非常好的解决方案,但实际上,最好的办法是质疑前提。如果一个类有一些很好的功能,那么一定要使用它,但不要从中继承,除非存在真正的is-a关系。Deepak关于向下投射的评论强烈表明,这种关系不存在,或者至少是不健康的。这假设视图实现了视图演示者,而原始文章中的视图包含视图演示者。@Dan:我想重点是我反对约束。我认为子类不应该返回子接口。它几乎消除了拥有继承结构的任何一点。
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
{
}