让我们假设以下类结构具有基类 BC 和 2 个派生类 DC_A 和 DC_B;此外,还有一个类 XY,其方法是 goo(),其参数类型为 BC 和其他方法
// 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) {}
}
In '使用多态传递值对象是一种不好的做法吗?' 提出了访问者模式;
If 级联和强制转换的问题被移动(而不是消除)到抽象基类中。
有更好的解决方案来完全避免 if 吗?
我(在此示例中)无法将功能从 doX/doY 移动到类 DC_A/DC_B
非常感谢您的建议。
编辑:这个问题的背景是一个 C# / WinForms 应用程序,它有一个表单来管理一个“测试规则”,该规则由不同的子实体组成,如 TestSpec 以及一组测量类型、测试限制等(我的 DC_A、DC_B 类)所有派生自EntityBase (=BC from above) 表单向控制器发送子实体已更改的事件;简化的 PropertiesChanged(EntityBase o) 控制器调用模型类中的相应方法(上面的类 XY 中的方法 goo),它现在负责执行业务逻辑,不仅保持更改的子实体测试限制,而且例如创建一个新的测试限制修订对象,增加测试规范修订等。
但是这种特殊情况让我想到了关于多态性的更通用或“哲学”的问题;-)