C# 设计以避免派生类中的类型转换?
假设我需要BaseView上的IBasePresenter属性。 现在此属性由JobView和ActivityView继承,但如果我需要在这些派生类中引用IJobViewPresenter对象,则需要将IbasPresenter属性强制转换为IJobViewPresenter或IActivityPresenter(我希望避免),或在派生类上创建JobViewPresenter和ActivityViewPresenter(如上所示) 我希望避免在派生类中进行类型转换,并且仍然具有对IJobViewPresenter或IActivityViewPresenter的引用,并且在BaseView中仍然具有IBasePresenter 有什么方法可以实现吗?您可以这样做:C# 设计以避免派生类中的类型转换?,c#,.net,design-patterns,C#,.net,Design Patterns,假设我需要BaseView上的IBasePresenter属性。 现在此属性由JobView和ActivityView继承,但如果我需要在这些派生类中引用IJobViewPresenter对象,则需要将IbasPresenter属性强制转换为IJobViewPresenter或IActivityPresenter(我希望避免),或在派生类上创建JobViewPresenter和ActivityViewPresenter(如上所示) 我希望避免在派生类中进行类型转换,并且仍然具有对IJobView
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
{
}