如何在抽象基类中部分实现契约?

RAM*_*RAM 5 .net c#

我有一个如下界面

 public interface IX
    {
        void MethodA();
        void MethodB();
    }
Run Code Online (Sandbox Code Playgroud)

我在MethodA和MethodB接口中有两个方法契约.我将定义将实现上述接口的类集.在这两种方法中,MethodA对于将实现该接口的所有类型都是通用的.我可以定义一个抽象类,如下所示

public abstract class XBase:IX
    {
        public void MethodA()
        { 
            // Common behaviour implementation
        }

        public abstract void MethodB();
    }
Run Code Online (Sandbox Code Playgroud)

并将此类继承到需要实现上述接口的所有类型.有用.

但是在抽象类中我添加了'public abstract void MethodB();'.它看起来像是重复MethodB合约.

如果类是抽象的,为什么C#不允许部分接口实现?上面的接口只有两种方法.假设一个接口有10个方法,5个是常用功能,5个不是,我们被迫添加抽象类中不常见的5个方法?

Han*_*ant 8

因为C#语言规范是这样说的.第13.4.7节:

与非抽象类一样,抽象类必须提供类的基类列表中列出的接口的所有成员的实现.

为什么C#设计师选择指定这样的语言可能是Eric Lippert最好的答案.我个人猜测减少意外隐藏方法发生的几率,产生很难解释的错误信息.对于接口方法实现,我个人更愿意使用覆盖关键字.但他们选择不这样做.

  • 关于非预期方法隐藏的观点很好 - 另一种说法是,这个规则是C#设计对抗脆弱基类失败的另一种方式.但是我要指出,当前规则的更明显的好处就是它很容易理解*.你有一个界面.你有一个实现接口的类.*该类需要实现界面的所有成员,句点*.该规则易于解释,易于检查,很容易产生明确的错误,并且很容易修复违规行为. (3认同)