如何限制类不实现c#中接口的所有方法?

本文关键字:接口 有方法 何限制 实现 | 更新日期: 2023-09-27 18:08:02

我在某个地方看到过这个问题。我们该如何处理这种情况呢?

我有一个接口,其中我有四个方法:Add, Subtract, Multiply, Divide

我有两个类AB

我希望AB实现这个接口。但是我想要这样的情况:

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

请告诉我这在c#中是如何实现的?如果可能的话,请告诉我

如何限制类不实现c#中接口的所有方法?

接口的意义在于定义两个对象之间的契约。如果你说你的对象只想实现部分契约,那么这就破坏了接口的意义。

为什么不使用多个接口,一个用于加减,另一个用于乘法/除法。您的类可以实现这些接口中的任何一个或两个。

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

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

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

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

实现类可以实现其中一个或另一个,或者两者都实现。

将接口拆分为两个接口:一个具有加减功能,名称为iaddsubsubtract;另一个具有乘法和除法功能,名称为IMultiplyDivide。然后你可以添加另一个接口(IOperation)来实现iaddsubtract和multiplydivide

您有两种方法:

将你的方法拆分为两个独立的接口,一个接口在类A中包含加减,另一个接口在类b中包含乘法和除法,这当然意味着你有两个接口而不是一个,所以决定这是否是个问题。

如果你坚持只有一个接口,你可以将A和B声明为抽象的(这当然意味着你不能实例化它们)

如果选择抽象的方法,你需要把你不想实现的接口方法也标记为抽象的。

您无法避免实现接口的所有方法。如果你继承了接口,你必须完成它。

在某些情况下,接口的某些方法不能对特定类具有有用的实现。当你得出结论,你应该实现接口,尽管如此,有一些事情你可以做:

  • 你可以在不做任何事情的情况下实现一个方法。如果类已经在没有它的情况下完成了预期的工作,您可以只接受方法调用,并且静默地不做任何事情。

  • 你可以抛出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