C#中使用Override和New關(guān)鍵字進行版本控制
1. 基礎(chǔ)概念
1.1 override
override 關(guān)鍵字用于重寫基類中已經(jīng)聲明為 virtual 或 abstract 的方法、屬性或索引器。使用 override 關(guān)鍵字可以提供基類方法的新實現(xiàn)。它的主要特點包括:
- 多態(tài)性:通過重寫方法,派生類可以實現(xiàn)特定的行為。
- 基類引用:即使是基類引用,調(diào)用重寫的方法也會執(zhí)行派生類的實現(xiàn)。
1.2 new
new 關(guān)鍵字用于隱藏基類中的成員(方法、屬性或事件)。當使用 new 關(guān)鍵字時,派生類中的成員將隱藏基類中的同名成員。它的特點包括:
- 不支持多態(tài)性:基類引用仍會調(diào)用基類的方法,而不是派生類的方法。
- 名稱隱藏:派生類中的成員遮蔽了基類中的同名成員,但兩者仍然存在于不同的作用域中。
2. 示例代碼
2.1. override 關(guān)鍵字
override 關(guān)鍵字用于子類中覆蓋(重寫)父類中的方法。這樣做可以讓子類提供特定的實現(xiàn),以滿足其對方法的個性需求。
示例 1:使用 override 覆蓋父類方法
using System; class Animal { public virtual void MakeSound() { Console.WriteLine("Animal makes a sound"); } } class Dog : Animal { public override void MakeSound() { Console.WriteLine("Dog barks"); } } class Program { static void Main(string[] args) { Animal myAnimal = new Animal(); Animal myDog = new Dog(); myAnimal.MakeSound(); // 輸出:Animal makes a sound myDog.MakeSound(); // 輸出:Dog barks } }
在這個例子中,Dog 類繼承自 Animal 類,并覆蓋了 MakeSound 方法。當 myDog.MakeSound() 被調(diào)用時,它將輸出 “Dog barks”,而不是 “Animal makes a sound”。
2.2. new 關(guān)鍵字
new 關(guān)鍵字在C#中有兩個主要用途:
它用于隱藏繼承自基類的成員(方法、屬性、事件等)。
它用于在接口中提供實現(xiàn)。
示例 2:使用 new 隱藏繼承的方法
using System; class Animal { public virtual void MakeSound() { Console.WriteLine("Animal makes a sound"); } } class Dog : Animal { new public void MakeSound() { Console.WriteLine("Dog barks"); } } class Program { static void Main(string[] args) { Animal myAnimal = new Animal(); Animal myDog = new Dog(); myAnimal.MakeSound(); // 輸出:Animal makes a sound myDog.MakeSound(); // 輸出:Dog barks } }
在這個例子中,盡管 Dog 類覆蓋了 MakeSound 方法,但是由于 new 關(guān)鍵字的使用,基類 Animal 的 MakeSound 方法不會被隱藏。
示例 3:使用 new 在接口中提供實現(xiàn)
using System; interface IMyInterface { void MyMethod(); } class MyClass : IMyInterface { public void MyMethod() { Console.WriteLine("Interface method implementation"); } } class Program { static void Main(string[] args) { IMyInterface myClass = new MyClass(); myClass.MyMethod(); // 輸出:Interface method implementation } }
在這個例子中,MyClass 類實現(xiàn)了 IMyInterface 接口,并使用了 new 來提供 MyMethod 的具體實現(xiàn)。
3.完整示例測試
3.1 基類和派生類的定義
using System; public class Animal { // 一個虛方法,可以在派生類中被重寫 public virtual void Speak() { Console.WriteLine("Animal speaks"); } // 一個普通方法,可以在派生類中被隱藏 public void Sleep() { Console.WriteLine("Animal sleeps"); } } public class Dog : Animal { // 重寫基類的虛方法 public override void Speak() { Console.WriteLine("Dog barks"); } // 使用 new 關(guān)鍵字隱藏基類的同名方法 public new void Sleep() { Console.WriteLine("Dog sleeps"); } }
3.2 測試代碼
接下來,我們可以編寫一個測試程序,來演示 override 和 new 的行為。
class Program { static void Main(string[] args) { Animal myAnimal = new Animal(); myAnimal.Speak(); // 輸出: Animal speaks myAnimal.Sleep(); // 輸出: Animal sleeps Animal myDog = new Dog(); myDog.Speak(); // 輸出: Dog barks (多態(tài)性) myDog.Sleep(); // 輸出: Animal sleeps (基類方法) Dog realDog = new Dog(); realDog.Speak(); // 輸出: Dog barks realDog.Sleep(); // 輸出: Dog sleeps (新定義的方法) Console.ReadLine(); } }
3.3 運行結(jié)果
運行上述程序,輸出結(jié)果如下:
Animal speaks
Animal sleeps
Dog barks
Animal sleeps
Dog barks
Dog sleeps
分析
多態(tài)性:在示例中,myDog 是 Animal 類型的引用,但它指向一個 Dog 對象。調(diào)用 Speak 方法時,輸出是 Dog barks,這就是多態(tài)性的體現(xiàn)。myDog.Sleep() 調(diào)用的是基類的 Sleep 方法,輸出 Animal sleeps,因為 Sleep 方法沒有被標記為 virtual。
隱藏行為:realDog.Sleep() 調(diào)用的是 Dog 類中定義的新 Sleep 方法,輸出 Dog sleeps。這表明使用 new 關(guān)鍵字隱藏了基類中的同名方法。
結(jié)論
override 和 new 是C#中用于版本控制和多態(tài)的兩個關(guān)鍵字。使用 override,我們可以為子類提供特定的方法實現(xiàn),而 new 則用于在繼承體系中隱藏基類的成員或為接口提供實現(xiàn)。這兩個關(guān)鍵字極大地增強了C#語言的靈活性和表達力。
以上就是C#中使用Override和New關(guān)鍵字進行版本控制的詳細內(nèi)容,更多關(guān)于C# Override和New版本控制的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
WinForm中DefWndProc、WndProc與IMessageFilter的區(qū)別
這篇文章主要介紹了WinForm中DefWndProc、WndProc與IMessageFilter的區(qū)別,較為詳細的分析了WinForm的消息處理機制,需要的朋友可以參考下2014-08-08C#實現(xiàn)復(fù)制文件夾中文件到另一個文件夾的方法
這篇文章主要介紹了C#實現(xiàn)復(fù)制文件夾中文件到另一個文件夾的方法,實例分析了C#實現(xiàn)文件夾的查找、判斷及文件復(fù)制相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07C# string轉(zhuǎn)unicode字符的實現(xiàn)
本文主要介紹了C# string轉(zhuǎn)unicode字符的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02