我在使用第三方库时发现了这种行为,我需要在其中隐藏和更改其中一个方法。
我有以下设置:
interface IBaseInterface
{
string MethodToHide();
}
class BaseClass : IBaseInterface
{
public string MethodToHide()
{
return "BaseClass";
}
}
class ChildClass : BaseClass
{
new public string MethodToHide()
{
return "ChildClass";
}
}
为什么当我运行以下命令时:
var i = (IBaseInterface) (new ChildClass());
Console.WriteLine(i.MethodToHide());
输出是
BaseClass
,但是当将 ChildClass 签名更改为
class ChildClass : BaseClass, IBaseInterface
,输出为
ChildClass
为什么要显式指定接口(interface)让 BaseClass 方法被 ChildClass 隐藏?
最佳答案
您需要阅读更多关于overriding 和hiding 的区别:
简而言之:
隐藏(使用new)根据变量的类型运行方法。
Overriding 覆盖方法,只会使用子方法。
编辑:
当您使用接口(interface)变量时:
var i = (IBaseInterface) (new ChildClass());
编译器将搜索接口(interface)使用的方法的最佳匹配。
因为你声明了 BaseClass 来实现接口(interface),所以它的方法将被选择。
如果 ChildClass 没有显式实现接口(interface),则编译器无法将方法链接到接口(interface)。从它的角度来看,BaseClass 恰好具有同名的方法。
当您显式声明ChildClass也实现了该接口(interface)时,其方法将是最佳选择。
关于c# - 为什么子类需要实现父接口(interface)来隐藏 C# 中的父方法之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5276954/