熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

使用Override和New關鍵字進行版本控制

2013-11-13 10:06:50  來源: .NET編程 

  C# 語言經過專門設計以便不同庫中的基類與派生類之間的版本控制可以不斷向前發展同時保持向後兼容這具有多方面的意義例如這意味著在基類中引入與派生類中的某個成員具有相同名稱的新成員在 C# 中是完全支持的不會導致意外行為它還意味著類必須顯式聲明某方法是要重寫一個繼承方法還是一個僅隱藏具有類似名稱的繼承方法的新方法

  C# 允許派生類包含與基類方法名稱相同的方法

  基類方法必須定義為 virtual

  如果派生類中的方法前面沒有 new 或 override 關鍵字則編譯器將發出警告該方法將有如存在 new 關鍵字一樣執行操作

  如果派生類中的方法前面帶有 new 關鍵字則該方法被定義為獨立於基類中的方法

  如果派生類中的方法前面帶有 override 關鍵字則派生類的對象將調用該方法而不調用基類方法

  可以從派生類中使用 base 關鍵字調用基類方法

  overridevirtual 和 new 關鍵字還可以用於屬性索引器和事件中

  默認情況下C# 方法不是虛方法 如果將一種方法聲明為虛方法則繼承該方法的任何類都可以實現其自己的版本若要使方法成為虛方法必須在基類的方法聲明中使用 virtual 修飾符然後派生類可以使用 override 關鍵字重寫基虛方法或使用 new 關鍵字隱藏基類中的虛方法如果 override 關鍵字和 new 關鍵字均未指定編譯器將發出警告並且派生類中的方法將隱藏基類中的方法

          class A
            {
                public A()
                {
                    ConsoleWriteLine(A);
                }

  public virtual void Fun()
                {
                    ConsoleWriteLine(AFun());
                }

  public virtual void Fun()
                {
                    ConsoleWriteLine(AFun());
                }

  public void Fun()
                {
                    ConsoleWriteLine(AFun());
                }
            }

  class B : A
            {
                public B()
                {
                    ConsoleWriteLine(B);
                }

  public new void Fun()
                {
                    ConsoleWriteLine(BFun());
                }

  public override void Fun()
                {
                    ConsoleWriteLine(BFun());
                }

  public void Fun()
                {
                    ConsoleWriteLine(BFun());
                }
            }

  static void Main(string[] args)
            {
                A a = new B();
                aFun();
                aFun();
                aFun();
                ConsoleRead();
            }

  輸出

  A
    B
    AFun()
    BFun()
    AFun()

  ——
    OVERRIDE和NEW的方法都必須是基類中VIRTUAL或ABSTRACT的方法

  ——
    OVERRIDE的方法是可以通過BASE前綴調用基類中被OVERRIDE的方法的

  ——
    NEW的方法是一個全新的方法不能使用BASE前綴來調用基類中被NEW後的方法

  override覆蓋(舊的沒有了)
    new新的(新舊共存)

  new關鍵字就是終止該方法的虛擬性比如

    class A
    {
    public abstract void func(){};
    }
    class B:A
    {
    public override void func(){};
    }
    class C:B
    {
    public new void func(){};
    }
    那麼你可以

    A a = new B();
    afunc();

    但不能這麼做
    A a = new C();
    afunc();

    而且也不能再override這個方法因為這個方法已經被終止了虛擬屬性所以不能這樣

    class D:C
    {
    public override void func(){};
    }


From:http://tw.wingwit.com/Article/program/net/201311/12593.html
  • 上一篇文章:

  • 下一篇文章:
  • Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.