日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

02-24 面向对象--方法重载、隐藏

發布時間:2024/4/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 面向对象--方法重载、隐藏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。