zoukankan      html  css  js  c++  java
  • 探討 C# 中的 new 修飾詞

    在 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) 
     

  • 相关阅读:
    Maven中的依赖相关总结
    Redis(序)应用场景
    Java并发专栏(一)—— Process vs Thread
    Java中转换为二进制的几种实现
    Java中转换为十六进制的几种实现
    oracle日期格式和java日期格式区别 HH24:mm:ss和HH24:mi:ss的区别
    远程教学的一些准备
    将latex的beamer做的幻灯片转换为ppt格式后的一些问题
    最近看过的雨课堂和智慧树的笔记
    关于在线授课的探索
  • 原文地址:https://www.cnblogs.com/WizardWu/p/1232791.html
Copyright © 2011-2022 走看看