Ask*_* B. 5 c# polymorphism interface
想象一下这些规范来自外部 dll。显式实现接口的类:
public interface IDebug
{
string GetImportantInfo();
}
public class ExternalClass : IDebug
{
public void DoSomethingImportant()
{
System.Diagnostics.Debug.WriteLine("Something important was done...");
}
string IDebug.GetImportantInfo() //Explicit implementation
{
DoSomethingImportant();
return nameof(ExternalClass);
}
}
Run Code Online (Sandbox Code Playgroud)
然后这个来自内部代码,你知道你需要实现接口:
public class Debug : ExternalClass, IDebug
{
public string GetImportantInfo()
{
return nameof(Debug);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我从子类调用Debug'sGetImportantInfo()方法时,不会调用超类中的显式实现:
static void Main(string[] args)
{
IDebug test = new Debug();
var impInfo = test.GetImportantInfo();
System.Diagnostics.Debug.WriteLine(impInfo); //"Debug"
}
Run Code Online (Sandbox Code Playgroud)
我似乎得到的唯一轻微提示是,在将IDebug接口添加到Debug类时,没有实现该方法,我没有收到编译错误:
public class Debug : ExternalClass, IDebug
{
}
Run Code Online (Sandbox Code Playgroud)
为什么在像这样覆盖超类的实现时没有编译警告?如果基类隐式实现它,我会收到一个编译警告,告诉我使用new关键字。但是使用new关键字覆盖显式实现的方法会给出编译警告:
成员“Program.Debug.GetImportantInfo()”不会隐藏继承的成员。不需要 new 关键字。
是否有预期目的,或者这是一个错误?如果是有意的,官方的理由是什么?
如果您使用显式实现,则在不转换为接口的情况下,方法在类中不可见。您将无法致电
new ExternalClass().GetImportantInfo()
Run Code Online (Sandbox Code Playgroud)
但你可以打电话
((IDebug)new ExternalClass()).GetImportantInfo();
Run Code Online (Sandbox Code Playgroud)
由于显式实现 new 关键字是不必要的。您甚至可以在一个类中添加两种实现:
public class ExternalClass : IDebug
{
string IDebug.GetImportantInfo() //Explicit implementation
{
return "Explicit";
}
public string GetImportantInfo()
{
return nameof(ExternalClass);
}
}
Run Code Online (Sandbox Code Playgroud)
此外,您的 Debug 类不必继承 IDebug 接口,因为它继承了ExternalClass。Resharper 会向您显示这是多余的。