D1D2这两个类是从抽象基类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()
    {
    }
}


我将派生对象的混合保留在单个集合中(例如列表),因为有时我必须对集合中所有对象调用通用(继承)方法,但有时我只想在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()的实现包含什么?)。界面和组成也无济于事。我觉得这是非常普遍的情况,我想知道在这种情况下最好的做法是什么?如何避免向下转换,但允许调用特定于派生类型的公共方法?

最佳答案

在我看来,考虑到您的描述,实际上“检查并向下转换”正好合适:


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


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

但是,我会略有不同:

foreach (var d2 in list.OfType<D2>())
{
    d2.Bar();
}


现在,这正是您的意思:)

关于c# - 派生类中引入的公共(public)接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18274772/

10-12 00:25
查看更多