如何限制类不要在C#中实现Interface的所有方法?

时间:2014-06-11 10:53:00

标签: c# interface

某处我读过这个问题。我们怎样才能处理这样的情况:

我有一个界面,我有四种方法:AddSubtractMultiplyDivide

我有两个课程 A B

我希望 A B 来实现此接口。但我想要这样的情况:

  • 只能访问AddSubtract
  • B 只能访问MultiplyDivide

请告诉我这在C#中怎么可能? 或者通过一些技巧,如果可能的话请告诉我。

5 个答案:

答案 0 :(得分:6)

接口的要点是定义两个对象之间的契约。如果你说你的对象只想实现一些契约,那就破坏了界面的含义。

为什么不使用多个接口,一个用于Add / Subtract,另一个用于Multiply / Divide。您的类可以实现这些接口中的任何一个或两个。

答案 1 :(得分:3)

实现接口的类必须实现其所有方法。 documentation说:

  

实现接口的类或结构必须实现接口定义中指定的接口成员。

在我看来,你需要的是两个接口:

  • IAdditiveOperators实现加法和减法。
  • IMultiplicativeOperators实现乘法和除法。

然后,实现类可以实现一个或另一个或两者。

答案 2 :(得分:2)

你有两种方法可以解决这个问题:

将方法分成两个独立的接口,并在A类中实现一个包含Add和Subtract的接口,另一个在B类中包含Multiply和Divide。这当然意味着你有两个接口而不是一个,所以决定是否这是一个问题。

OR

如果你坚持只有一个界面,你可以将A和B声明为抽象(这当然意味着你无法实例化它们)

如果采用抽象路线,你需要将你不想实现的接口方法标记为抽象。

答案 3 :(得分:2)

将界面拆分为两个界面:一个使用Add和Substract并命名为IAddSubstract,另一个使用Multiply和Divide,名称为IMultiplyDivide。然后你可以添加另一个实现IAddSubstract和IMultiplyDivide的接口(IOperation)

答案 4 :(得分:1)

您无法避免实施该界面的所有方法。如果继承了接口,则必须实现它。

在某些情况下,界面的某些方法可能不具备特定类的有用实现。在得出你应该实现接口的结论之后,你可以做一些事情:

  • 您可以将方法实现为什么都不做。如果班级已经做了没有它的预期,你可以接受方法调用并默默地做任何事情。

  • 如果通过调用方法获得某些结果,则可以抛出NotSupportedException,该类无法实现。当然,只有当方法对于如何使用接口并不重要时,才应该这样做。


此外,您可以隐式或明确地实现接口成员。隐式是正常的方式,当引用的类型是接口时以及它是类时,成员是可见的。

明确地实现一个成员只有当引用的类型是接口时它才可见,而不是当它是类时。

如果Multiply方法在类A中显式实现(并且接口名为ICanCalc):

A obja = new A();
ICanCalc infa = new A();

infa.Multiply(); // works fine
obja.Multiply(); // gives a compiler error

但是,该方法只是隐藏,您仍然可以通过简单地转换引用来使用它:

(ICanCalc)obja.Multiply(); // works fine