所以我最近在工作中遇到了这个C#语句:
public new string SomeFunction(int i)
{
return base.SomeFunction(i);
}
我在网上搜索,但我想我可以在这里找到更好的答案。
现在,我猜这一切都是返回一个新字符串,其值与调用base.SomeFunction(i)
返回的字符串相同......这是正确的吗?
此外,这个功能是否存在于其他语言中(具体是java)?
修改:
在我的具体情况下,base.SomeFunction
受到保护,不虚拟......这会有所作为吗?感谢
答案 0 :(得分:9)
不,这意味着它在基类中隐藏 SomeFunction
而不是覆盖它。如果基类中没有一个方法具有相同的签名,则会出现编译时错误(因为你试图隐藏那些不存在的东西!)
有关详细信息,请参阅this question。 (我不认为这是一个重复的问题,因为它是关于“新”的内容,而不仅仅是在缺席时讨论警告。)
我在这个问题的答案中重复了一些例子,只是为了保存点击...
以下是隐藏方法和覆盖方法之间区别的示例:
using System;
class Base
{
public virtual void OverrideMe()
{
Console.WriteLine("Base.OverrideMe");
}
public virtual void HideMe()
{
Console.WriteLine("Base.HideMe");
}
}
class Derived : Base
{
public override void OverrideMe()
{
Console.WriteLine("Derived.OverrideMe");
}
public new void HideMe()
{
Console.WriteLine("Derived.HideMe");
}
}
class Test
{
static void Main()
{
Base x = new Derived();
x.OverrideMe();
x.HideMe();
}
}
输出结果为:
Derived.OverrideMe
Base.HideMe
答案 1 :(得分:1)
'new'是成员隐藏关键字。来自文档:
当用作修饰符时,新的 关键字显式隐藏成员 继承自基类。当你 隐藏继承的成员,派生 该成员的版本取代了 基类版本。虽然你可以 隐藏成员而不使用 新修饰符,结果是警告。 如果你使用new来明确隐藏一个 会员,它抑制了这个警告和 记录派生的事实 版本旨在替代。
答案 2 :(得分:1)
示例代码背后的意图是在子代中使该函数公开,即使它在基础中受到保护。该语言不允许您在子项中使类成员 more 可见,因此这将声明一个恰好具有相同名称的新函数。这隐藏了基本功能,但是再一次,调用者首先不能访问那个,而这个函数调用基类函数。
简而言之,代码有点像黑客,但它确实有意义。但这可能暗示基地可能需要重构其功能。