如何在类中实现接口的function?

面试官在采访中问我以下问题,但我不知道这个问题的答案是什么,请帮帮忙!

如果我不想在我的类中实现一个在我的类实现的接口中声明的函数,那么必须要做什么。

编辑:我使用.NET与C#。 如果有人能在C#中提供示例代码示例,那将会很棒。

谢谢

实现该函数,但在实现中抛出exception

在.NET中,通常使用以下之一(在其他语言中有类似的exception类型)。

  • NotImplementedException :该方法尚未实现。

  • NotSupportedException :根据设计,此类中不会有该方法的实现。 这在基类的虚方法中出现过几次,其中派生类应该在适用的情况下提供实现。 它也出现在显式接口实现方法中(←这是访问者提出的具体问题) ,例如ICollection.Add等的ReadOnlyCollection实现。

例如,在C#中:

 public void MyNotSupportedInterfaceMethod() { throw new NotImplementedException(); } 

更新:正如marcos所指出的,如果你的类是抽象的,你可以将实现留给inheritance者,但你仍然需要声明它:

 public abstract class MyClass : ISomeInterface { public abstract void MyNotImplementedInterfaceMethod(); } 

这些问题总是难以回答,因为很难知道面试官会得到什么。 这个问题没有直接的答案,因为所有实现接口的类都必须实现其方法。 如果您正在寻找一些代码来回答它,您可能会过度思考它。

在我看来,如果没有真正的答案,这个问题只有口头问题,但你可以了解受访者的想法。 可能的答案可能是:

  • 实现该方法但抛出exception。
  • 使类抽象并将方法声明为抽象。
  • 从接口定义中删除方法。
  • 我不认为这是可能的。

一切都是有效的,没有人真正完全回答这个问题。

我怀疑采访者试图引出“使用显式接口实现”的响应。 如果你说

 class C : IFoo { void IFoo.Foo() {} } 

那么你可以通过界面使用Foo,但不能通过类:

 C c = new C(); c.Foo(); // illegal! IFoo ifoo = c; ifoo.Foo(); // legal 

如果那是面试官所得到的,那么面试官需要做两件事。

首先,他们应该说“如何在不暴露类的接口方法的情况下实现接口?”

其次,他们不应该首先提出这个问题。 面试官正在寻求具体答案的问题很少,实际上并没有告诉你很多候选人! 关于该主题的更好的问题是“在实现接口的方法时,如何决定是使用显式还是隐式实现?” 这告诉你候选人如何做出技术决定。

不了解c#,但在java中你可以使这个类抽象化。 这样,您可以将实现留给下一个非抽象类来扩展抽象类。

对我来说,这是一个棘手的问题。 如果您的类正在实现接口,那么它应该实现每个方法。 如果接口上有一个您不想实现的方法,则意味着您不希望实现该接口,您希望实现另一个类似的接口。

显然,有些情况下您必须实现一个接口,以允许您的类与另一个类或方法一起使用。 在这些情况下,您应该查看已定义此合同的类/方法。 如果可以的话,改变它,如果你不能,那么你实现一个特定于情况的方法(这可能要么什么也不做或抛出exception),但知道你没有真正履行他们的合同,并且在任何时候他们代码可能会更改导致您的代码失败。

如果可能,请修改接口,因为这违反了接口隔离原则 。

编辑:如果不可能,请选择Philippe Leybaert的优秀答案。