繁体   English   中英

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

[英]Why do a child class need to implement a parents interface to hide one of that parents methods in 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方法的接口?

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

链接: 覆盖与隐藏

简而言之:

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

编辑

使用Interface变量时:

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

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

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

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

您需要在BaseClass中将MethodToHide标记为虚拟。 然后你的ChildClass可以覆盖它。 有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80).aspx

我相信这是规范的相关部分:

10.6.3虚方法在虚方法调用中,进行该调用的实例的运行时类型决定了要调用的实际方法实现。 在非虚方法调用中,实例的编译时类型是决定因素。

因此,当您将原始对象转换为IBaseInterface时。 它确定类型是BaseClass,因为它是实现它并调用其方法的类型。 在第二个示例中,它将其解析为ChildClass并调用其方法。

因为main-class实现了接口。 子类只定义了一个与接口无关的新方法。 实际上,子类隐藏了这个方法 - 这就是'new'的作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM