當你用 new 關鍵字作為宣告修飾符時,你明確隱藏了基底類別提供的成員。 當您隱藏繼承的成員時,成員的衍生版本會取代基類版本。 當基底類別版本在衍生類別中可見時,你可以隱藏成員。 如果基底類別版本標記為 或 private 在某些情況下是 internal,則看不到。 雖然您可以在不使用 修飾詞的情況下public隱藏protected或new成員,但會收到編譯程式警告。 如果您使用 new 明確隱藏成員,則會隱藏此警告。
C# 語言參考資料記錄了 C# 語言最新版本。 同時也包含即將推出語言版本公開預覽功能的初步文件。
文件中標示了語言最近三個版本或目前公開預覽版中首次引入的任何功能。
小提示
欲查詢某功能何時首次在 C# 中引入,請參閱 C# 語言版本歷史的條目。
您也可以使用 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'.