Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何不在类中实现接口的函数?_C#_Oop_Interface - Fatal编程技术网

C# 如何不在类中实现接口的函数?

C# 如何不在类中实现接口的函数?,c#,oop,interface,C#,Oop,Interface,一位面试官在面试中问了我以下问题,但我不知道这个问题的答案是什么,请帮忙 如果我不想,我必须做什么 在我的类中实现一个函数 在接口中声明,该接口是 由我的班级实施 编辑:我将.NET与C#一起使用。如果有人能提供C#中的示例代码,那就太好了 谢谢实现该函数,但是在实现中抛出异常 在.NET中,您通常使用以下其中一种(在其他语言中也有类似的异常类型) :尚未实现该方法 :按设计,此类中不会有该方法的实现。这在基类的虚拟方法中多次出现,在基类的虚拟方法中,派生类将在适用的情况下提供实现。它也出现在

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

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

编辑:我将.NET与C#一起使用。如果有人能提供C#中的示例代码,那就太好了


谢谢

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

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

  • :尚未实现该方法

  • :按设计,此类中不会有该方法的实现。这在基类的虚拟方法中多次出现,在基类的虚拟方法中,派生类将在适用的情况下提供实现。它也出现在方法(← 这是面试官问的具体问题),例如
    ReadOnlyCollection
    实现
    ICollection.Add
    ,等等

例如,在C#中:

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

public abstract class MyClass : ISomeInterface
{
   public abstract void MyNotImplementedInterfaceMethod();
}
我不知道c#,但在java中可以将类抽象化。
这样,您就可以将实现留给下一个非抽象类来扩展抽象类。

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

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

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

所有的答案都是正确的,没有一个能完全回答问题。

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


显然,在某些情况下,您必须实现一个接口,以允许您的类与另一个类或方法一起使用。在这些情况下,您应该检查定义此契约的类/方法。如果可以更改它,如果不能,则实现特定于该情况的方法(这可能是不执行任何操作或引发异常)但是知道你并没有真正履行他们的合同,而且在任何时候他们的代码都可能发生变化,导致你的代码失败。

我怀疑面试官试图得到的回答是“使用明确的接口实现”。如果你说

class C : IFoo
{
    void IFoo.Foo() {}
}
然后,您可以通过接口使用Foo,但不能通过类使用Foo:

C c = new C();
c.Foo(); // illegal!
IFoo ifoo = c;
ifoo.Foo(); // legal
如果这就是面试官想要表达的意思,那么面试官需要做两件事

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


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

如果可能,请修改接口,因为这违反了


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

但是@Philippe,我认为在这种情况下,我们正在课堂上实现它。没有其他方法。C#没有可选接口方法的概念(例如,在目标C中)是的,我们确实有,因此面试官的意思可能是,如果您的实现不支持应用程序逻辑的特定功能,而不是实际上不实现该功能。好,因此,总的来说,您必须实现该函数,但可以通过抛出异常来绕过它。@Prashant如果您使类抽象,则不能这样做。True,但您仍然必须声明接口函数。当然,你不必实现它。我确信“oops”标签并不代表“我又做了一次”——但它代表什么呢?我明白了,但是这个对我来说是新的。是打字错误吗?@Prashant,我编辑了被接受的答案。你应该通读全文以获得更广泛的理解,但我也特别标出了面试官所问问题的确切答案。或者(通常情况下),面试官不是候选人的对手,他/她想通过提出面试官认为只有一个正确答案的问题来显得聪明。
C c = new C();
c.Foo(); // illegal!
IFoo ifoo = c;
ifoo.Foo(); // legal