派生类中引入的公共接口

Boj*_*zec 1 c# oop inheritance downcast

两个类,D1并且D2从一个抽象基类派生B.他们每个人都在分享共同声明公共接口B,但他们每个人可能也有自己特定的公共接口(例如D2具有D2.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()
    {            
    }
}
Run Code Online (Sandbox Code Playgroud)

我不断派生对象的组合在单个集合,(如表),因为有时候我不得不打电话共同(继承)在集合中的所有对象,但有时我想调用方法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();
Run Code Online (Sandbox Code Playgroud)

我觉得代码闻到了这里.向下倾斜是一个坏主意,根据类型检查做出决定是个坏主意.如果我移动Bar()到基类,在D1对象上调用它是没有意义的(包含的实现是D1.Bar()什么?).界面和组合也没有帮助.我觉得这是一种非常普遍的情况,我想知道这种情况下的最佳做法什么?如何避免向下转换但允许调用特定于派生类型的公共方法?

Jon*_*eet 5

在我看来,实际上"检查和降低" 恰好适合您的描述:

有时我想只在D2对象上调用Bar():

现在这是一个奇怪的要求,但如果它一个要求,我认为以一种简单的方式实现它是合理的,而不是为基类上没有意义的操作添加无操作实现.

但是,我会稍微改变一下:

foreach (var d2 in list.OfType<D2>())
{
    d2.Bar();
}
Run Code Online (Sandbox Code Playgroud)

现在这说明你的意思:)