给定以下类结构:
class Base {}
class DerivedA: Base {}
class DerivedB: Base {}
class Container
{
public List<Base> Items { get; }
}
随着我的应用程序开发更多功能,派生对象列表会随着时间的推移而增长。我正在尝试做:
Container container = ReturnsContainer();
foreach (var item in container.Items)
{
doStuff(item);
}
其中 doStuff(item) 被派生类型重载。
void doStuff(DerivedA) {}
void doStuff(DerivedB) {}
这不起作用,因为编译器说“无法从'Base'转换为'DerivedA'”和“最佳重载方法匹配doStuff(DerivedA)有一些无效参数”。我能想到的最好方法是:
Container container = ReturnsContainer();
foreach (var item in container.Items)
{
if (item is DerivedA)
{
doStuff((DerivedA)item);
}
else if (item is DerivedB)
{
doStuff((DerivedB)item);
}
}
关于如何使这个更清洁的任何想法?由于我的 Derived 类型只会随着时间的推移而增长,因此我必须返回并添加到这个 long if 结构才能继续进行这项工作。
我认为随着派生类型数量的增加,container.Items.OfType<> 解决方案将转化为不断增长的(和不必要的)性能损失。
我必须为此使用通用代表吗?对于感觉应该是简单的多态性的东西来说,这似乎是一个过于复杂的解决方案。
编辑:为了更清楚起见,假设 Base 和 Derived 类型层次结构位于单独的 API 层上,并且不可修改(最终类)。该解决方案必须使用现有的继承结构,并且不能扩展 Base 和 Derived 对象。尽管随着时间的推移,API 层可以增长新的派生类。