某处我读过这个问题。我们怎样才能处理这样的情况:
我有一个界面,我有四种方法:Add
,Subtract
,Multiply
,Divide
。
我有两个课程 A 和 B 。
我希望 A 和 B 来实现此接口。但我想要这样的情况:
Add
,Subtract
。Multiply
,Divide
。请告诉我这在C#中怎么可能? 或者通过一些技巧,如果可能的话请告诉我。
答案 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