我从 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/