如何在类中实现接口的功能?

时间:2009-12-03 16:40:53

标签: c# oop interface

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

  

如果我不想,必须做些什么   在我的班级实现一个功能   在一个接口中声明   由我的班级实施。

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

由于

6 个答案:

答案 0 :(得分:13)

在实现中实现该功能,但抛出异常

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

  • NotImplementedException还没有该方法的实现。

  • NotSupportedException:根据设计,不会此类中方法的实现。这在基类的虚方法中出现过几次,其中派生类应该在适用的情况下提供实现。它也出现在explicit interface implementation方法(←这是访谈者要求的具体内容),例如ReadOnlyCollection<T> ICollection<T>.Add的实施等。

例如,在C#中:

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

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

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

答案 1 :(得分:7)

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

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

  • 实现方法但抛出异常。
  • 使类抽象化并将方法声明为抽象。
  • 从界面定义中删除方法。
  • 我认为这不可行。

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

答案 2 :(得分:6)

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

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

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

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

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

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

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

答案 3 :(得分:4)

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

尽可能修改界面,因为这违反了Interface Segregation Principle

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