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

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

我有以下设置:

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

为什么我需要显式指定ChildClass隐藏的BaseClass方法的接口?

您需要更多地了解覆盖和隐藏之间的区别:

链接:Override versus Hide

简而言之:

隐藏(使用new)根据变量的类型运行方法.
覆盖会覆盖该方法,并且只会使用子方法.

编辑:

使用Interface变量时:

var i = (IBaseInterface) (new ChildClass());

编译器将搜索接口使用的方法的最佳匹配.
因为您声明了BaseClass来实现接口,所以将选择其方法.

如果ChildClass没有显式实现接口,则编译器无法将方法链接到接口.从它的角度来看,BaseClass恰好具有相同名称的方法.

当您明确声明ChildClass也实现了接口时,它的方法将是最佳选择.

相关文章
相关标签/搜索