WizardWu 編程網

一位台灣的工程師,接觸 .NET 逾十年,近年研究 SQL Server、Performance Tuning、手機應用

博客园 首页 新随笔 联系 订阅 管理

在 C# 中的 new 關鍵字,除了能夠當作建立 instance、呼叫 constructor 的運算子 (operator) 外,亦可作為「隱藏;遮蔽 (shadow)」用的修飾詞 (modifier),並可用來修飾 method、property、field,以及「巢狀類 (nested class)」裡面的 class。

在「父類 (base class)」、「子類 (derived class)」中若存在同名的 field,在 Java 中預設會由子類的 field 直接 shadow 父類的 field (Java 沒有 .NET 的 property,Java  的 field 又可稱為 variable);而在 C# 中,則應在子類的 field 前面,加上 new 修飾詞 (在 VB.NET 中為 Shadows)。若您不加的話,程序仍然能夠編譯及執行,但會得到一項警告訊息。在 C# 中,您仍可用 base 關鍵字去引用父類的 field。

public class MyBaseC 
{
   
public static int x = 55;            // field x
}


public class MyDerivedC : MyBaseC 
{
   
new public static int x = 100;    // Name hiding(shadowing)
}

代碼 1 field shadowing


同名 field 談完,接下來再談同名 method。在父類、子類中若存在同名的 method,則在子類中的 method 前加上 new 修飾詞,可隱藏父類的 method,其作用就如同用 override 關鍵字,去「覆寫」掉父類中同名的 virtual method。若您不加的話,和 field 一樣,程序仍然能夠編譯及執行,但會得到一項警告訊息。

在 method 中會需要使用 new 修飾詞,而不用 override,通常是因為有三層以上的繼承關係,並且因程序需求,需要替「再衍生的類 (孫類)」提供新的同名 virtual method,而非「覆寫」掉父類該版本的 method。如下方關係圖:

   父類的同名方法(virtual) ← 子類的同名方法(new+virtual) ← 孫類的同名方法(override)

上方三個 class 為繼承關係,皆有同名的 method,且在子類中的 method 加上了 new 修飾詞,因此會重新定義(隱藏) 在父類中宣告為 virtual 的 method,提供孫類一個「全新的」同名 method,而非最頂層父類的版本。


有興趣進一步瞭解的網友,可參考 msdn 的文件,例如這篇原文文件:
http://msdn.microsoft.com/en-us/library/51y09td4(VS.71).aspx

In C#, the new keyword can be used as an operator or as a modifier.
* new operator        Used to create objects on the heap and invoke constructors.
* new modifier         Used to hide an inherited member from a base class member.


-------------------------------------------------
(本文在版工的舊 Blog 中,發表日期為 2006/10/11) 
 

posted on 2008-07-01 00:21  WizardWu  阅读(684)  评论(1编辑  收藏  举报