c# - 为什么子类需要实现父接口(interface)来隐藏 C# 中的父方法之一?

标签 c# inheritance interface

我在使用第三方库时发现了这种行为,我需要在其中隐藏和更改其中一个方法。

我有以下设置:

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 隐藏?

最佳答案

您需要阅读更多关于overridinghiding 的区别:

链接:Override versus Hide

简而言之:

隐藏(使用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/

相关文章:

c# - 学习 windbg 的特性和优点的最佳资源是什么?

javascript - 当未提供内容类型 '' 应用程序/Json 时,C# [WebMethod] 未命中

c# - 从资源中声明一个 const 字符串

python - 使用父实例初始化子实例

inheritance - 在 golang 中嵌入结构给出错误 "unknown field"

java - 概念差异 : Fully Abstract Class v. 接口(interface)

delphi - RemObjects Hydra 插件无法直接处理 WM_DEVICECHANGE Windows 消息

c# - 不可变数据结构和并发

javascript - 如何制作一个可以多次继承的对象?

c# - 接口(interface)和基类混合,正确的实现方式