我们假设以下具有基类BC和2个派生类DC_A和DC_B的类结构; 此外还有一类XY具有梅索德咕()与BC类型的参数和其他methodes如何避免'如果级联'和使用多态性类型转换?
// base class
public class BC
{
public virtual void foo();
}
// derived class A
public class DC_A : BC
{
public override void foo() {}
}
// derived class B
public class DC_B : BC
{
public override void foo() {}
}
public class XY
{
public void goo(BC o)
{
// perfectly fine using polymorphism; no Ifs' no casting, OOP at its best ;-)
o.foo();
// but what to do here?
if ((o as DC_A) != null)
{
doX(o as DC_A);
}
else if ((o as DC_B) != null)
{
doY(o as DC_B);
}
}
private void doX(DC_A o) {}
private void doY(DC_B o) {}
}
在“Is passing around value objects using polymorphism a bad practice?”访问者模式提出的;
的级联如果的问题和铸造移动(未消除)到抽象基类。
有没有更好的解决方案,以完全避免,如果的?
它没有选择,我(在这个例子中)移动的功能从DOX/DOY类DC_A/DC_B
你的意见是非常赞赏。
编辑: 此问题的背景是一个带有窗体的C#/ WinForms应用程序,用于管理由不同子实体组成的“测试规则”,包括测量类型,测试限制等的集合DC_A,DC_B类)全部从EntityBase派生(=来自上面的BC) 表格向控制器发送一个事件,表明子实体已经改变; 简化PropertiesChanged(EntityBase O) 控制器调用模型中的类对应的梅索德(从上方类XY梅索德咕),其现在负责做这不仅持续改变的子实体测试极限,而且例如在businesslogic创建一个新的测试极限值修订的对象,增加了测试规范的修订等。 也许这样 具有类似于PropertiesChanged(EntityBase O)A梅索德的通用方法应改为从形式和具体的事件处理程序更specifing事件在控制器和模型类来处理“TestLimitChanged”等
不过这种特殊情况,导致我多态更通用的或“哲学”的问题在所有;-)
如果DOX和DOY工作非常不同,但应在同一地点被称为逻辑,唯一错了你的做法是,你应该委托艇员选拔的责任,这在其他地方使用。 –