c# - 继承自一个类,这是做什么的?

标签 c# oop interface

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

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/

相关文章:

C++:在显示一些数据时避免 setter/getter

java - 为什么Iterable接口(interface)中的forEach方法不是抽象的?

java - 从接口(interface)的方法列表中调用单个方法

c# - 行在 GridView 中多次出现

matlab - Matlab中的继承多态性

c# - 所有(OOP)依赖项的根存储在哪里?

golang源码为什么要这样写

c# - 我们可以在没有 azure 或机器人模拟器的情况下在自己的客户端中测试机器人吗?

c# - C# 数组中的线程安全

c# - 使用构建后事件在 Visual Studio 中重命名项目输出会产生错误