遵循接口的规定。如果一个类使用一个接口,那么它必须实现该接口中定义的所有方法。

5
如果一个类正在使用接口,那么它必须满足以下条件:
(1) 继承接口的属性 (2) 包含与接口相同的方法 (3) 创建一个接口对象或者是一个接口类型的引用变量 (4) 以上全部
正确答案是(4)。注意:这个问题来自这里,我不知道谁是作者。
我同意第(1)和第(2)点,但我对第(3)点的措辞有争议。
我想它有双重解释;
创建一个接口对象可以意味着继承接口的类的实例。
或者是一个接口类型的引用变量。
上述哪种解释是正确的?
下面的表述是否有意义?
如果一个类正在使用接口,那么它必须:
(1) 继承接口的属性 (2) 为接口公开的所有方法提供实现 (3) ??? (4) 以上全部

3
因为属性实际上是方法,所以1其实只是2的特例;我不确定有任何合理的解释方式来理解3...很可能本来就没有 - Marc Gravell
2
同时定义单词“using”。它可能意味着“implements”吗?否则,“using”也可以表示“通过其接口使用实现接口的类”... - oddparity
2
问题的措辞很糟糕。类是“实现”接口,而非“使用”它们。也许(3)是说实现接口的类不能是静态的一种糟糕的表达方式。如果你说“使用一个接口”,我会认为这是指一个属性具有接口类型。 - Moho
11
我点击了你提供的链接中的一些问题,发现它们都措辞非常差。我不会关注那个网站。 - CodeCaster
3
一些回答是完全错误的。我认为这个测试比帮助任何人更多地造成了困惑。 - Rik
显示剩余10条评论
3个回答

8
(2)提供接口暴露的所有方法的实现。不,抽象类可以在不提供实现的情况下实现接口(它们仍然必须声明接口中定义的方法,但不必提供方法体)。
不过我也不知道如何解释第3点。查看您提供的链接时,这只是一个问题措辞不好的问题。我仍在努力理解这意味着什么:
1.代码public class B : A { }的输出是什么? - 错误 - 它定义了一个仅继承A的公共方法的类。 - 它定义了一个继承A的所有方法,但不能访问私有成员的类。 - b和c

1
一个接口继承另一个接口时,并不需要实现函数。 - user2085599
2
你说得对。这个测试来自的网站是一个糟糕的资源,我不应该在 Stack Overflow 上提到它。 - user2140173
@FunctionR 这个问题特别涉及到一个类。 - svick
1
我也不确定是否应该将使用显式接口实现的类视为“继承”其实现的接口的成员(包括属性)。 - supercat
一个抽象类仍然必须声明继承的接口成员。例如,abstract class X : IDisposable { } 是不合法的。但是 abstract class Y : IDisposable { public abstract void Dispose(); } 应该是可以的。 - Jeppe Stig Nielsen
显示剩余3条评论

0
如果一个类实现了一个接口,那么就必须实现该接口定义的所有方法,包括基本接口方法。否则,编译器会抛出错误。 另外,一个接口继承一个基本接口并具有相同的成员函数名称。 那么,基本接口成员名称将被隐藏在派生接口名称中。

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

-1

我认为你可能误读了一些内容。我看到这段文字告诉我的是:

(1) 为了实现一个类,以便创建一个该类的实例对象,该类的每个方法和实现的接口都必须是具体的——必须完全实现。

(2) 因为接口与对象实例相关联,所以在访问相关方法之前必须先存在一个对象实例。

我并没有看到它说什么更深层次或独特的东西。你提出的那行似乎只是在强调这第二点:要使用接口方法,你需要拥有一个关联类的对象,才能调用这些方法。

这是因为 C# 中的接口不支持静态方法。因此,所有方法都是实例方法……因此,如果没有关联对象——接口的实例或“接口对象”,就无法“使用”接口。


3
你和那个网站做的一样,滥用术语。"to implement an object"是什么意思?"the associated class" 又是什么?"the implemented interfaces must be concrete"又是什么?术语存在是为了让我们都知道我们在谈论同一件事情。没有冒犯的意思,但你说的话就像那个网站一样毫无意义。声称“如果一个类正在使用接口,它必须创建一个接口对象”就是胡说八道,毫无意义。 - CodeCaster
2
CodeCaster,你陷入了一种我认为对那些提出合理问题的人没有帮助的陷阱。通过非常狭隘地解释术语,你并没有做出建设性的贡献。我每年在康奈尔大学教授Java和C#课程,有1000名学生,我认为在这个角色中学到的一件事情就是要对他人使用的语言有一定的灵活性。请记住,并不是每个人都是英语母语者。因此,我们的工作包括尝试理解问题的意图。仅仅因为一个问题用“白话”提出而将其搪塞掉是不公平的。 - Ken Birman
1
现在,如何才能做到建设性?通过认识到“实现一个对象”显然是“实现一种类型,然后实例化它以创建对象实例”的简称。我们不需要因为使用明显的常见简写而责备人们!这样做非常狭隘,而且不是教授提问者任何东西,只是断言术语的僵化。这个人提出的问题是完全合理的。他或她只是用一种常见的简写风格提出了问题。 - Ken Birman
2
虽然我大多数情况下同意你的观点,但我认为它们在这里并不适用。OP在一个旨在作为学习资源使用的网站上找到了这个问题。通过使用如此不清晰的术语,他们自己就被取消了学习的资格。试图解释所谓的含义毫无意义,因为这纯粹是垃圾,那里的其他问题同样糟糕。 - CodeCaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接