c# - 在 C# 中对抽象类使用接口(interface)

标签 c# inheritance interface abstract-class

我从 C++ 开始学习 C#,但碰壁了。

我有一个抽象类 AbstractWidget、一个接口(interface) IDoesCoolThings 和一个派生自 AbstractWidget 的名为 RealWidget 的类:

public interface IDoesCoolThings
{
    void DoCool();
}

public abstract class AbstractWidget : IDoesCoolThings
{
    void IDoesCoolThings.DoCool()
    {
        Console.Write("I did something cool.");
    }
}

public class RealWidget : AbstractWidget
{

}

当我实例化一个 RealWidget 对象并在其上调用 DoCool() 时,编译器给我一个错误提示

'RealWidget' does not contain a definition for 'DoCool'

我可以将 RealWidget 对象转换为 IDoesCoolThings,然后调用将起作用,但这似乎是不必要的,而且我也失去了多态性(即使我定义了 RealWidget.DoCool() 也会始终调用 AbstractWidget.DoCool())。

我认为解决方案很简单,但我已经尝试了多种方法,但我终究还是想不出这个。

最佳答案

您遇到问题是因为您使用了 explicit interface implementation (EII)。当一个成员被显式实现时,它不能通过类实例访问——只能通过接口(interface)实例访问。在您的示例中,这就是您不能调用 DoCool() 的原因,除非您将实例转换为 IDoesCoolThings

解决方案是公开DoCool()并移除显式接口(interface)实现:

public abstract class AbstractWidget : IDoesCoolThings
{
    public void DoCool()      // DoCool() is part of the abstract class implementation.
    {
        Console.Write("I did something cool.");
    }
}

// ...

var rw = new RealWidget();
rw.DoCool();                  // Works!

通常,您在两种情况下使用 EII:

  • 您有一个必须实现两个接口(interface)的类,每个接口(interface)都包含一个成员,该成员与另一个接口(interface)中的另一个成员具有相同的名称/签名。
  • 您希望强制客户不依赖于您的类的实现细节,而是依赖于您的类正在实现的接口(interface)。 (有些人认为这是一种很好的做法。)

关于c# - 在 C# 中对抽象类使用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/684260/

相关文章:

xcode - 盲程序员 : designing an interface in Xcode without being able to visually position UI elements

c# - 在 wpf 中将 treeviewitem 显示为网格行

c# - 如何将 CreateUserWizard 中额外添加的字段的信息保存在与 Membership 数据库不同的单独数据库中?

c# - 从组合框的选定索引更改的源中获取其他值

visual-studio-code - 关闭 VS Code 后如何找到欢迎屏幕?

Java 泛型接口(interface)与泛型方法,以及何时使用它们

c# - 后退按钮硬件不刷新页面 xamarin forms c#

c++ - C++中的私有(private)继承以及如何重用但修饰基类的运算符?

javascript - 如何为子原型(prototype)创建不同的原型(prototype)变量?

c++ - 将 "this"传递给线程 C++