當做宣告修飾詞使用時, new 關鍵詞會明確隱藏繼承自基類的成員。 當您隱藏繼承的成員時,成員的衍生版本會取代基類版本。 這假設成員的基類版本是可見的,因為如果成員標示為 private 或,在某些情況下 internal,它已經隱藏。 雖然您可以在不使用 修飾詞的情況下new隱藏public或protected成員,但會收到編譯程式警告。 如果您使用 new 明確隱藏成員,則會隱藏此警告。
您也可以使用 new 關鍵詞來 建立型別的實例 ,或做為 泛型型別條件約束。
若要隱藏繼承的成員,請使用相同的成員名稱在衍生類別中宣告它,並使用 關鍵詞加以修改 new 。 例如:
public class BaseC
{
public int x;
public void Invoke() { }
}
public class DerivedC : BaseC
{
new public void Invoke() { }
}
在此範例中, BaseC.Invoke 會由 DerivedC.Invoke隱藏。 欄位 x 不會受到影響,因為它不會以類似的名稱隱藏。
透過繼承隱藏的名稱會採用下列其中一種形式:
一般而言,類別或結構中引進的常數、欄位、屬性或類型會隱藏共用其名稱的所有基類成員。 有特殊情況。 例如,如果您宣告名稱為的新欄位
N具有不可叫用的類型,而基底類型宣告N為方法,則新字段不會隱藏基底宣告的調用語法。 如需詳細資訊,請參閱 C# 語言規格的成員查閱一節。類別或結構中引進的方法會隱藏在基類中共用該名稱的屬性、欄位和類型。 它也會隱藏具有相同簽章的所有基類方法。
類別或結構中引進的索引器會隱藏具有相同簽章的所有基類索引器。
因為兩個修飾詞具有互斥的意義,所以在同 new 一個成員上使用 和 覆寫 是錯誤的。 修飾 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'.