02-24 面向对象--方法重载、隐藏
在面向對象思想中,由于基本特性--繼承所致,產生了子類繼承父類的關系,所以出現重載方法。
由于子類對象同事“匯聚了”父類和子類的方法所有公共方法,而C#并未對子類和父類的方法名稱過多的 加以限制,因此會出現一些問題。
如果子類中的某個方法與父類方法的簽名一致(即方法名和方法參數一樣),那當通過子類對象訪問此方法時,訪問的是子類方法還是父類方法?
這就需要先從子類方法和父類方法之間的關系說起,總的來說,子類方法和父類方法之間的關系可以概括為一下三種。
- 擴充:子類方法,父類沒有;
- 重載:子類有父類的同名函數,但參數類型或數目不一樣;
- 完全相同:子類方法和父類方法從方法名稱到參數類型完全一樣。
對于第一種"擴充"關系,由于子類與父類方法不同名,所以不存在同名方法調用的問題,重點分析后兩種情況。
(1)重載
在上面已介紹過方法重載的概念,再同一個類中構成重載的方法主要根據參數列表來決定調用哪一個。這一基本判斷方法可以推廣到類的繼承情況。
?
1 namespace _20141212jicheng 2 { 3 class Parent //父類 4 { 5 public void OverloadF() //父類的方法 6 { 7 } 8 } 9 class Child : Parent //子類繼承父類 10 { 11 public void OverloadF(int i)//子類的方法(帶參數的方法) 12 { 13 } 14 } 15 }?
使用代碼如下:
1 static void Main(string[] args) 2 { 3 4 Child obj = new Child(); 5 obj.OverloadF(); //調用父類的重載方法 6 obj.OverloadF(100); //調用子類的重載方法 7 8 }可看出,雖然重載的方法分布在不同的類中,但仍然可以將其看成是定義在同一類中的,其使用方法與調用類的其他方法并無不同。
(2)隱藏
當子類與父類擁有完全一樣的方法時,稱“子類隱藏了父類的同名方法”,請看實例項目。
1 class Parent //父類 2 { 3 public void HideF() //父類的方法 4 { 5 System.Console.WriteLine("Parent.HideF()"); 6 } 7 } 8 class Child : Parent //子類繼承父類 9 { 10 public void HideF()//子類的方法 11 { 12 System.Console.WriteLine("Child.HideF()"); 13 } 14 }注意現在子類和父類都擁有了一個完全相同的方法HideF(),于是問題就產生了:
1 Child c = new Child(); 2 c.HideF();//調用父類的還是子類的同名方法?上述代碼運行時,輸出:
修改以下代碼:
1 Parent p = new Parent(); 2 p.HideF();//調用父類的還是子類的同名方法?上述代碼運行結果:
由此得出結論:
當分別位于父類和子類的兩個方法完全相同時,調用哪個方法由對象變量的類型決定。
然而,面向對象的繼承特性允許使用子類對象被當成父類對象使用,這就問題復雜化了,以下代碼運行時,會出現什么結果?
1 Child c = new Child(); 2 Parent p; 3 p = c; 4 p.HideF();//調用父類的還是子類的同名方法?上述代碼運行結果:
這就意味著即使Parent變量P中世紀引用的是Child類型的對象,通過P調用的方法還是Parent類的;
如果確實希望調用的子類的方法,應該這樣使用:
1 ((Child) p).HideF();運行結果:
即先進行強制類型轉換。
回到前面的Parent和Child類的定義,VS在編譯這兩個類時,會發出一個不符合C#語句規范的警告,修改之后:
1 class Child : Parent //子類繼承父類 2 { 3 public new void HideF()//子類的方法 4 { 5 System.Console.WriteLine("Child.HideF()"); 6 } 7 }“new”關鍵字明確告訴C#編譯器,子類隱藏父類的同名方法,提供自己的新版本。
由于子類隱藏了父類的同名方法,所以如果要在子類方法的實現代碼中調用父類被隱藏的同名方法,請使用base關鍵字,代碼如下:
base.HideF();//調用父類被隱藏的方法
?
轉載于:https://www.cnblogs.com/xiaoqingshe/p/4298537.html
總結
以上是生活随笔為你收集整理的02-24 面向对象--方法重载、隐藏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用OpenLDAP作为身份验证源
- 下一篇: Oracle的奇葩设置之非归档模式与RM