C#方法重载(overload)方法重写(override)隐藏(new)
一、重載:同一個作用域內發生(比如一個類里面),定義一系列同名方法,但是方法的參數列表不同。這樣才能通過傳遞不同的參數來決定到底調用哪一個。
?? ? ? ?值得注意的是,方法重載只有通過參數不同來判斷調用哪個方法,而不能通過返回值。至于原因,可以這樣理解,你調用一個方法,如果有多個方法同名,系統必須要知道到底你要調用哪一個,參數可以幫助系統在方法入口處得到答案,他根據你給的參數就知道該使用哪個方法。如果只有返回值的不同,很多情況系統是不可能得到有效的判斷條件的,比如:double method();int method();如果你這樣調用:method()。系統當然不知道該調用哪個。
示例:
?//返回值相同,參數不同
???
class BillPayment{void PayBill(int TelephoneNumber){//此方法用于支付固定電話費}void PayBill(long CustomerNumber){//此方法用于支付電費}void PayBill(long CustomerNumber,double amount){//次方法用于支付移動電話費}} }?
//返回值相同,參數個數不同
class Add {int addtion(int num1,int num2){return num1+num2;}int addtion(int num1,int num2,int num3){returnnum1+num2+num3;} }
?
//參數不同,返回值不同
int Method(int[] numbers) { } double Method(double[] numbers) { }
?
?? ? ? ? 注:泛型出現后,相同參數,相同返回值的方法也能構成重載,這里不介紹。
?
?????????
二、重寫:繼承時發生,在子類中重新定義父類中的方法,子類中的方法和父類的方法是一樣的,即方法名,參數,返回值都相同。
?? ? ? ? ?例如:基類方法聲明為virtual(虛方法),派生類中使用override申明此方法的重寫.
??????????
?? ? ? ? ?重寫override一般用于接口實現和繼承類的方法改寫,要注意:
? ????????1、覆蓋的方法的標志必須要和被覆蓋的方法的名字和參數完全匹配,才能達到覆蓋的效果;
?? ???????2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
?? ???????3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;
?? ???????4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,并沒有對其進行覆蓋。
??????? 示例:
namespace 方法重寫 {class Program{static voidMain(string[] args){BaseClass CO =new ClassOverride();CO.SetName("Override");} //基類public classBaseClass{public virtualvoid SetName(string name){Console.WriteLine("基類:我的名字是" + name);}}//派生類public classClassOverride : BaseClass{publicoverride void SetName(string name){Console.WriteLine("Override:我的名字是" + name);}}} }
?? ? ?在方法重寫中,我們介紹了虛方法,那么虛方法和抽象方法有什么區別呢?
?
1.虛方法有一個實現部分可以被子類繼承,從而使子類獲得和基類相同的方法,另外也為派生類提供了覆蓋該方法的選項。相反,抽象方法沒有提供實現部分,是一種強制派生類覆蓋的方法(否則派生類不能成具體類)
?
2.(abstract)抽象方法只能在抽象類中聲明,(virtual)虛方法不是。
?
3.(abstract)抽象方法必須在派生類中重寫而(virtual)虛方法不必。
?
4.(abstract)抽象方法不能聲明方法實體,虛方法可以。
?
?
????????? 個人感覺,方法重載和方法重寫都有點像多態,同一個方法的多種形態:執行“相同”的方法,卻通過它們自己的實現代碼來實現,即同一種方法,不同的對象會產生不同的結果。
?
三、隱藏(方法):基類方法不做申明(默認為非虛方法),在派生類中使用new聲明此方法的隱藏。隱藏時,訪問父類則調用父類的方法,訪問子類則調用子類的方法。
示例:??
namespace 隱藏 {class Program{static voidMain(string[] args){ClassNew CN =new ClassNew();CN.SetName("new");BaseClass BC =CN;BC.SetName("基類");}//基類public classBaseClass{public voidSetName(string name){Console.WriteLine("基類:我的名字是" + name);}} //派生類public classClassNew : BaseClass{//這里如果不使用new,將生成警告!new publicvoid SetName(string name){Console.WriteLine("new:我的名字是" + name);}}} }
運行結果:new:我的名字是new
?? ? ? ? ? ? ? ? ? 基類:我的名字是基類
?
如果上述扔不好理解,我們再舉一個隱藏靜態變量的例子
?
namespace 隱藏繼承成員 {class Program{public classBaseClass{public static int A = 123;}public classClassNew : BaseClass{new public static int A = 456;static voidMain(string[] args){Console.WriteLine(A);}}} }
?? ? ? 運行結果:456
?
?
????????注:不僅有方法隱藏,還有其他的,通過繼承隱藏名稱一般采用下列形式之一:?
?
1.引入類或結構中的常數、指定、屬性或類型隱藏具有相同名稱的所有基類成員。
?
2.引入類或結構中的方法隱藏基類中具有相同名稱的屬性、字段和類型。同時也隱藏具有相同簽名的所有基類方法。
?
3.引入類或結構中的索引器將隱藏具有相同名稱的所有基類索引器。
?
4.在同一成員上同時使用 new 和 override 是錯誤的。
?
?? ? ? ? 另外,在不隱藏繼承成員的聲明中使用 new 修飾符將生成警告。在隱藏繼承成員的生命中不使用new修飾符也將產生警告
轉載于:https://www.cnblogs.com/javaspring/archive/2011/09/15/2656609.html
總結
以上是生活随笔為你收集整理的C#方法重载(overload)方法重写(override)隐藏(new)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 福克斯1.8MT驾驶心得
- 下一篇: UVA 321 The New Vill