2009-07-23 39 views
3

所以我最近就遇到了这个C#声明的工作:在返回类型的C#方法定义之前添加'new'?

public new string SomeFunction(int i) 
{ 
    return base.SomeFunction(i); 
} 

我在网上搜索,但我想我可以在这里找到一个更好的答案。

现在,我猜测,所有这些都会返回一个新字符串,其值与由base.SomeFunction(i)调用返回的字符串相同......这是正确的吗?

此外,此功能是否存在于其他语言(特定于Java)?

编辑:
在我的特定情况下,base.SomeFunction保护和虚拟...这是否有所作为?由于

+0

对于我刚才问的问题,anwsers也可能会有所帮助:http://stackoverflow.com/questions/1014853/c-public-new-string-tostring-vs-public-override-string-tostring – marcgg 2009-07-23 15:49:40

回答

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 
+0

派生的.HideMe会如何被击中呢? – Polaris878 2009-07-23 15:21:07

1

“N ew'是会员隐藏关键字。从该文档:

当作为改性剂使用的,新的关键字 明确地隐藏从基类继承的成员 。当您 隐藏继承的成员时,派生的 版本的成员将替换 基类的版本。虽然您可以在不使用 新修饰符的情况下隐藏成员,但结果是警告。 如果您使用new来明确隐藏 成员,它将禁止此警告,并且 会记录派生的 版本将用作替换的事实。

1

您的示例代码背后的意图是使该函数在子项中公开,即使它在基础中受到保护。该语言不允许你创建一个班级成员更多在孩子中可见,所以这个而是声明一个恰好具有相同名字的新功能。这隐藏了基本函数,但是再次,调用者不会首先访问那个函数,而这个函数调用基类函数。

简而言之,代码有点破解,但确实有意义。不过,这可能暗示着基地可能需要重构其功能。

相关问题