【问题标题】:How not to implement a function of an interface in class?如何不在类中实现接口的功能?
【发布时间】:2009-12-03 16:40:53
【问题描述】:

面试中有个面试官问了我下面这个问题,但是我不知道这个问题的答案是什么,请大家帮忙!!!

如果我不想这样做,必须做什么 在我的类中实现一个函数 在一个接口中声明,该接口是 由我的班级实现。

已编辑:我正在使用带有 C# 的 .NET。如果有人能提供 C# 中的示例代码示例,那就太好了。

谢谢

【问题讨论】:

  • 我确信“oops”标签不代表“我又做了一次”——但它代表什么?我明白了,哎呀,但这对我来说是新的。是不是笔误?
  • @Prashant,我编辑了接受的答案。您应该阅读整篇文章以获得广泛的理解,但我还专门标记了面试官所问问题的确切答案。

标签: c# oop interface


【解决方案1】:

实现函数,但在实现中抛出异常

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

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

  • NotSupportedException:按照设计,在这个类中不会实现该方法。这在基类的虚拟方法中多次出现,派生类在适用的情况下应提供实现。它也出现在explicit interface implementation方法中(←这是面试官问的具体内容),例如ICollection<T>.AddReadOnlyCollection<T>实现等

例如,在 C# 中:

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

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

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

【讨论】:

  • 但是@Philippe,我认为在这种情况下我们正在课堂上实现它。
  • 没有其他办法。 C# 没有可选接口方法的概念(例如在 Objective C 中)
  • 是的,我们确实是,所以面试官的意思可能是如果您的实现不支持应用程序逻辑的特定功能而不是字面上不实现该功能。
  • 好的,所以总的来说你必须实现这个功能,但你可以通过抛出异常来绕过它。
  • @Prashant 如果你把你的类抽象化了就不行。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    如果这是面试官的意思,那么面试官需要做两件事。

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

    其次,他们一开始就不应该问这个问题。面试官正在寻求具体答案的措辞不佳的问题实际上并不能告诉您有关候选人的太多信息!关于该主题的一个更好的问题是“在实现接口的方法时,您如何决定是使用显式实现还是隐式实现?”这会告诉你候选人如何做出技术决定。

    【讨论】:

    • 或者(通常情况下),面试官不适合应聘者,他/她想通过问一些面试官认为只有一个正确答案的问题来显得聪明。
    【解决方案4】:

    不知道c#,但是在java中你可以使类抽象。 这样您就可以将实现留给下一个非抽象类来扩展您的抽象类。

    【讨论】:

    • 是的,但是你仍然需要声明接口函数。当然,您不必实现它。
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      尽可能修改接口,因为这违反了Interface Segregation Principle

      编辑:如果不可能,请使用 Philippe Leybaert 的出色回答。

      【讨论】:

        猜你喜欢
        • 2010-12-18
        • 2010-11-11
        • 2013-02-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-03
        • 1970-01-01
        • 2021-01-14
        • 1970-01-01
        相关资源
        最近更新 更多