【发布时间】:2016-09-15 14:32:57
【问题描述】:
在子类中重写接口的显式实现的正确方法是什么?
public interface ITest
{
string Speak();
}
public class ParentTest : ITest
{
string ITest.Speak()
{
return "Meow";
}
}
public class ChildTest : ParentTest
{
// causes compile time errors
override string ITest.Speak()
{
// Note: I'd also like to be able to call the base implementation
return "Mooo" + base.Speak();
}
}
以上是对语法的最佳猜测,但显然是错误的。它会导致以下编译时错误:
错误 CS0621:
`ChildTest.ITest.Speak()': 虚拟或抽象成员不能 私人的
错误 CS0540:
ChildTest.ITest.Speak()': containing type does not implement interfaceITest'
错误 CS0106:
修饰符 `override' 对该项目无效
我实际上可以在不使用显式接口的情况下让它工作,所以它实际上并没有阻止我,但出于我自己的好奇心,我真的很想知道,如果想使用显式接口执行此操作,正确的语法是什么?
【问题讨论】:
-
隐式接口实现有什么问题?你想完成什么?
-
@chomba,使用显式接口一直是我代码库中的一种风格选择。我只是认为看一个实现了 4 或 5 个不同接口的类并知道哪些方法与哪些接口相关联要干净得多。我的大多数用例都很好,这是我第一次遇到它们的限制。
-
@JamesMcMahon 据我所知,显式的主要用例是具有相同签名的成员的多个接口。我很少看到它们被使用,如果我这样做了,我会觉得编写代码的人并不经常编写 C#。
-
是的,这符合程序员的偏好,stackoverflow.com/questions/143405 有很多答案,这些答案涉及每种方法的优缺点。
-
@JamesMcMahon 是的,我同意,但我觉得这是经常使用该语言的人最同意的事情之一。这与看到
var some_object = new my_class()的 C# 代码感到奇怪的方式相同;蛇案例没有什么问题,但在 C# 中感觉格格不入。