继承一个类,这有什么作用?

mrb*_*lah 1 c# oop interface

我看到了这段代码,并有一些问题:

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可以覆盖的虚方法实现接口会更好.