防止实现不是接口方法的方法

时间:2015-08-31 07:12:34

标签: c# .net interface

是否可以阻止在实现接口的类中实现公共非接口方法?

E.g。

    public interface ICanDoSomething
    {
        void CanDoA();

        void CanDoB();
    }

    public class Doer : ICanDoSomething
    {
        public void CanDoA()
        {
            //Do A
        }

        public void CanDoB()
        {
            //Do B
        }

        public void CanDoC()
        {
            //Don't do this!!! it's not defined in the interface!!!
        }
    }

为了澄清,我想在编译时阻止它,而不是在运行时。

2 个答案:

答案 0 :(得分:5)

如果C#能够做你想要达到的目标,语言本身就会破坏面向对象的编程功能之一:封装

让实施者以自己的方式实现接口,并专注于接口实现的质量,而不是将精力放在上,而不是实现比接口定义的方法更多的方法即实现一个单元/集成测试,实施者应通过该测试来证明黑盒实际上按预期工作)。

当您使用界面时,您会得到黑盒子:您不关心实现如何完成工作,但是如果它能够正确地完成工作,您就会关心

取自你在自己的问题中添加的一些评论:

  

没有具体的用例,只想指导那些使用库的人   面向组件的功能并避免上帝对象。

你想避免上帝对象,但你想要上帝方法。每个人都会喜欢一个具有良好的关注点和分割的类,而不是每个都有1k代码行的3种方法。

OP说...

  

打破单一责任原则怎么样?如果是一个班级   实现一个接口突然开始做很容易的事情   是其他班级的责任,是不是也打破了OOP?

不,单一责任原则与面向对象编程的定义(即继承,多态和封装)无关,但它与代码质量<相关/强>

无法通过接口或使用任何自己的编程语言构造来确保代码质量。这是code review的使命。

当然,自动化测试可确保代​​码以质量运行,这与以质量编码不同。

答案 1 :(得分:3)

从技术上讲,您无法阻止CanDoC()声明,但您可以通过工厂方法内部实施无用

// interface is public when its implementation is internal
internal class Doer : ICanDoSomething {
  // To prevent creating Doer as Doer
  protected internal Doer() { // or internal
    //Some staff if required
  }

  public void CanDoA() {... }

  public void CanDoB() {... }

  // Technically possible
  public void CanDoC() {... }
}

public static class DoerFactory {
  // ... create instead Doer as ICanDoSomething instance
  // (factory method)
  public static ICanDoSomething Create() {
    return new Doer();
  } 
}

...

ICanDoSomething test = DoerFactory.Create();

test.CanDoA(); // OK

test.CanDoC(); // Compile time error

(test as Doer).CanDoC(); // Compile time error when called in an assembly other than Doer