我看到了这段代码,并有一些问题:
public class MyClassB : MyClassA, IMyClass
{
void IMyClass.InsertUser(User user) { }
}
Run Code Online (Sandbox Code Playgroud)
为什么他们必须为接口添加前缀,IMyClass而不仅仅是:
void InsertUser(User user) { }
Run Code Online (Sandbox Code Playgroud)
或者也许
void new InsertUser(User user)
Run Code Online (Sandbox Code Playgroud)
此外,由于您继承自MyClassA(实现接口IMyClass),为什么我们会看到:
public class MyClassB : MyClassA, IMyClass { }
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 10
只是
void InsertUser(User user)
Run Code Online (Sandbox Code Playgroud)
不会起作用,因为它会声明一个私有方法.带前缀的版本称为显式接口实现.它使该方法仅通过接口可用.其主要用途之一是允许您实现包含相同方法的多个接口.最好的例子是IEnumerable<T>扩展IEnumerable- 都有一个GetEnumerator()方法,但具有不同的返回类型.你通常会这样做:
public class Foo : IEnumerable<T>
{
// Implicit interface implementation
public IEnumerator<T> GetEnumerator()
{
// Real work
}
// Explicit interface implementation
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator(); // Calls method above
}
}
Run Code Online (Sandbox Code Playgroud)
至于重新声明界面,如果你还重新实现了它在你这里做的接口,那么这是必要的.我的猜测是MyClassA使用非虚方法(或显式)实现接口,这意味着它不能在派生类中重写...所以要重新实现接口,你必须重新声明它.
就个人而言,我会尽可能地避免这种情况 - 当被调用的方法完全取决于你是如何"看到"有问题的对象时,它会导致各种问题.MyClassA使用MyClassB可以覆盖的虚方法实现接口会更好.