我看到这段代码,有一些问题:
public class MyClassB : MyClassA, IMyClass
{
void IMyClass.InsertUser(User user) { }
}
为什么他们必须在接口(interface) IMyClass
前添加前缀,而不仅仅是:
void InsertUser(User user) { }
或者也许做
void new InsertUser(User user)
此外,由于您继承自 MyClassA
(它实现了接口(interface) IMyClass
),为什么我们会看到:
public class MyClassB : MyClassA, IMyClass { }
最佳答案
只是
void InsertUser(User user)
不会工作,因为它会声明一个私有(private)方法。带有前缀的版本称为 explicit interface implementation .它使该方法仅通过接口(interface)可用。它的主要用途之一是允许您实现包含相同方法的多个接口(interface)。最好的例子是 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
}
}
至于重新声明接口(interface),如果您还重新实现您正在此处执行的接口(interface),则这是必要的。我的猜测是 MyClassA
使用非虚拟方法(或显式)实现接口(interface),这意味着它不能在派生类中被覆盖...因此要重新实现接口(interface),您必须重新声明它。
就我个人而言,我会尽量避免这种情况 - 当被调用的方法完全取决于您碰巧如何“查看”相关对象时,它可能会导致各种问题。 MyClassA
会更好使用虚拟方法实现接口(interface) MyClassB
然后可以覆盖。
关于c# - 继承自一个类,这是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1439619/