new 修飾詞 (C# 參考)
更新:2007 年 11 月
當 new 關鍵字做為修飾詞時,會明確隱藏繼承自基底類別的成員。當您隱藏繼承的成員時,該成員的衍生版本就會取代基底類別版本。雖然您可以不用 new 修飾詞來隱藏成員,但是這樣會產生警告。如果您使用 new 來明確隱藏成員,此關鍵字就會隱藏這類警告,並會記錄企圖使用衍生版本做為替代的事實。
若要隱藏繼承的成員,請在衍生類別 (Derived Class) 中使用相同名稱為其宣告,並且以 new 修飾詞加以修飾。例如:
public class BaseC
{
public int x;
public void Invoke() { }
}
public class DerivedC : BaseC
{
new public void Invoke() { }
}
在此範例中,BaseC.Invoke 是由 DerivedC.Invoke 加以隱藏。x 欄位不會受到影響,因為它不是由類似的名稱所隱藏。
經由繼承 (Inheritance) 進行名稱隱藏可採取下列之一種格式:
類別或結構所引入的常數、欄位、屬性或型別可隱藏所有具相同名稱的基底類別成員。
類別或結構所引入的方法可隱藏基底類別中具相同名稱的屬性、欄位和型別。它也可隱藏所有具相同簽章 (Signature) 的基底類別成員。
類別或結構所引入的索引子可隱藏所有具相同簽章的基底類別成員。
在相同的成員上同時使用 new 和 override 會造成錯誤,這是因為這兩個修飾詞在意義上是互斥 (Mutually Exclusive) 的。new 修飾詞會以相同名稱建立新成員,並使原始成員變為隱藏。override 修飾詞會擴充繼承成員的實作。
在未隱藏繼承的成員之宣告中使用 new 修飾詞會產生警告。
範例
在這個範例中,基底類別 BaseC 以及衍生類別 DerivedC 會使用相同的欄位名稱 x,而該欄位會隱藏繼承之欄位的值。範例中示範了 new 修飾詞的用法。同時還示範如何使用完整限定名稱存取基底類別的隱藏成員。
public class BaseC
{
public static int x = 55;
public static int y = 22;
}
public class DerivedC : BaseC
{
// Hide field 'x'.
new public static int x = 100;
static void Main()
{
// Display the new value of x:
Console.WriteLine(x);
// Display the hidden value of x:
Console.WriteLine(BaseC.x);
// Display the unhidden member y:
Console.WriteLine(y);
}
}
/*
Output:
100
55
22
*/
在這個範例中,巢狀類別會隱藏基底類別中具有相同名稱的類別。此範例會示範如何使用 new 修飾詞來消除警告訊息,以及如何使用隱藏類別成員的完整限定名稱來對其進行存取。
public class BaseC
{
public class NestedC
{
public int x = 200;
public int y;
}
}
public class DerivedC : BaseC
{
// Nested type hiding the base type members.
new public class NestedC
{
public int x = 100;
public int y;
public int z;
}
static void Main()
{
// Creating an object from the overlapping class:
NestedC c1 = new NestedC();
// Creating an object from the hidden class:
BaseC.NestedC c2 = new BaseC.NestedC();
Console.WriteLine(c1.x);
Console.WriteLine(c2.x);
}
}
/*
Output:
100
200
*/
如果您移除 new 修飾詞,程式仍然可以編譯和執行,但會得到下列警告:
The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.
如果巢狀型別 (Nested Type) 隱藏了另一個型別,您也可以使用 new 修飾詞來修改巢狀型別,如下列範例所示。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格中的下列章節:
- 10.3.4 new 修飾詞