2009-07-23 40 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

您的示例代碼背後的意圖是使該函數在子項中公開,即使它在基礎中受到保護。該語言不允許你創建一個班級成員更多在孩子中可見,所以這個而是聲明一個恰好具有相同名字的新功能。這隱藏了基本函數,但是再次,調用者不會首先訪問那個函數,而這個函數調用基類函數。

簡而言之,代碼有點破解,但確實有意義。不過,這可能暗示着基地可能需要重構其功能。

相關問題