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

認識.NET中的虛函數[2]

2022-06-13   來源: .NET編程 

  運行時綁定僅體現在虛函數中因此在試驗輸出的結果是CAFoo因為Foo沒有被申明為virtual在編譯階段已經把caFoo綁定到CAFoo

  Override只能用於虛函數中當子類繼承基類他便擁有了基類所有的函數Override修飾的函數將替換基類原來的函數否則子類會新增加一個函數並同時保留基類中的函數 下面的這個例子很好的說明了這個問題

class CA {
    public virtual void Foo() {
      ConsoleWriteLine(CAFoo);
    }
  }
  
  class CB : CA {
    public override void Foo()  {
      ConsoleWriteLine(CBFoo);
    }
  }
  
  class CC : CA  {
    public new void Foo()  {
      ConsoleWriteLine(CCFoo);
    }
  }
  
  class Test  {
    public static void Main()  {
      ConsoleWriteLine(typeof(CB)GetMethods()Length);  // 輸出
      ConsoleWriteLine(typeof(CC)GetMethods()Length); // 輸出
    }
  }

  這段程序輸出CB和CC的函數個數CB的個函數中個來自於SysetmObject剩下的一個就是FooCC中多了一個函數因為使用了new (如果不使用new也是相同的結果因為C#編譯器默認使用new但不顯示指明new會給出一個警告)說明了CCFoo是一個不同於CAFoo的虛函數

  所以在試驗不使用override我們在InvokeFoo中調用的還是CAFoo()雖然這個時候還是運行時綁定但是因為CBFoo並沒有覆蓋CAFoo因此我們還是得到了基類的實現

  當一個函數不是虛函數的時候子類中相同簽名的函數總是覆蓋了父類中的函數並不需要override關鍵字所以c#編譯器會把它當作一個錯誤如上表中試驗所示

  如果讀者理解了上面的內容那麼來看看一個略微復雜的情況我們邀請interface出場!

interface IA  {
    void Foo();
}
  class CA: IA {
    public void Foo() {
      ConsoleWriteLine(CAFoo);
    }
}

  [問題]: Foo是虛函數嗎?

  答案是肯定的就像interface方法不能顯示聲明為public一樣我們也不能在IAFoo前面加上virtual原因很簡單所有的interface方法都是虛函數!在調用interface方法的時候總是要使用運行時綁定

[]  []  []  


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

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