两个类,D1
并D2
派生自一个抽象基类B
。它们中的每一个都共享在其中声明的公共公共接口,B
但它们中的每一个也可能有自己特定的公共接口(例如D2
hasD2.Bar()
仅对对象有意义D2
):
public abstract class B
{
public int N { get; set; }
public abstract void Foo();
}
public class D1 : B
{
public override void Foo()
{
}
}
public class D2 : B
{
public override void Foo()
{
}
public void Bar()
{
}
}
我将派生对象混合在一个集合中(例如列表),因为有时我必须对集合中的所有对象调用通用(继承)方法,但有时我只想调用Bar()
对象D2
:
var list = new List<B>();
list.Add(new D1());
list.Add(new D2());
foreach(var b in list)
if(b is D2)
(b as D2).Bar();
我觉得这里的代码有异味。向下转型是个坏主意,根据类型检查做出决定是个坏主意。如果我转向基类,在对象Bar()
上调用它是没有意义的(包含什么实现?)。界面和组合也无济于事。我觉得这是一种非常常见的情况,我想知道在这种情况下最好的做法是什么?如何避免向下转换但允许调用特定于派生类型的公共方法?D1
D1.Bar()