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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

浅谈继承

發布時間:2025/7/14 编程问答 9 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈继承 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引言

?????面向對象的三大利器:封裝,繼承,多態,正是因為這三個主要特性,演化出了眾多優秀的設計模式和框架,只有掌握了它們才能真正掌握面向對象。本文主要探討繼承的概念,都是些簡單的語法,但是可能很多人在學習了若干框架、模式后,反而忘記或者說淡忘了一些基本的概念,筆者就是其中一個,故寫下此文,一方面溫故而知新,另一方面也強調基礎的重要性。

概念

?????繼承就是在類之間建立一種相交關系,使得新定義的派生類的實例可以繼承已有的基類的特征和能力,而且可以加入新的特性或者是修改已有的特性建立起類的新層次。我們知道,現實中的事物都是有其相似和區別的,如果我們將相似的特征提取出來集中描述,不同的特征分別描述并包括那些相同的特征,那就是一個典型的繼承。相似的特征我們可以構造一個基類封裝起來,而對于那些有區別的特征,我們可以構建不同的子類封裝并繼承基類,從而擴展或重定義基類的行為。

基礎語法

?????下面我想通過一些例子,探討和總結繼承的應用規則,示例代碼如下:

場景一:

Code
public?class?BaseClass
????
{
????????
public?BaseClass()
????????
{
????????????Console.WriteLine(
"Base?Class?Constructor");
????????}


????????
public?void?SayHello()
????????
{
????????????Console.WriteLine(
"Hello,?everyone,?I'm?base?class.");
????????}

????}


????
public?class?ChildClass?:?BaseClass
????
{
????}


????
public?class?Test
????
{
????????
public?static?void?Main(string[]?args)
????????
{
????????????ChildClass?child?
=?new?ChildClass();
????????????child.SayHello();
????????}

????}

?????代碼很簡單,定義了一個基類BaseClass,包含一個無參構造函數,一個SayHello方法;子類ChildClass繼承基類,但是不定義任何方法;Test類用于測試,創建一個ChildClass的實例,并調用SayHello方法,輸出結果如下:??

?????Base Class Constructor???

?????Hello, everyone, I'm base class.

結論:在ChildClass中,我們沒有定義任何的成員,只是繼承BaseClass,但是卻能調用父類的SayHello方法,并且從結果我們可以看出,整個的調用過程如下:第一步,實例化ChildClass,雖然我們沒有定義它的構造函數,但是對于任何類,都有一個默認的構造函數,也就是說ChildClass中實際有這樣一個構造函數:public ChildClass() { };通過輸出結果,我們可以看出,ChildClass的構造函數實際調用了BaseClass的構造函數; 第二步,調用child實例的SayHello方法,很明顯該方法是繼承自BaseClass的。

場景二:

?????下面對ChildClass做一些小的修改,添加一個無參構造函數,添加一個SayHello方法,由于跟父類的方法重名了,故需要在SayHello前面加了個new關鍵字,用來表示隱藏基類的方法,不然編譯器會報警,具體代碼如下:

Code
?public?class?ChildClass?:?BaseClass
????
{
????????
public?ChildClass()
????????
{
????????????Console.WriteLine(
"Child?Class?Constructor");
????????}


????????
public?new?void?SayHello()
????????
{
????????????Console.WriteLine(
"Hello,?everyone,?I'm?child?class.");
????????}

????}

輸出結果如下:???

?????Base Class Constructor

?????Child Class Constructor

?????Hello, everyone, I'm child class.

結論:1 驗證了前面說的,實例化的時候,會先調用父類構造函數,然后再調用子類構造函數;2 如果定義一個與父類重名的方法,會隱藏父類的方法而不會覆蓋父類的方法,我們可以做個實驗,修改Main方法如下:

Code
?public?static?void?Main(string[]?args)
????????
{
????????????BaseClass?child?
=?new?ChildClass();
????????????child.SayHello();
????????}

實例化一個ChildClass后,將對象指向BaseClass的引用,輸出結果如下:??

?????Base Class Constructor

?????Child Class Constructor

?????Hello, everyone, I'm base class.

?由此可見,如此調用的是基類的SayHello方法。

場景三:

?????修改BaseClass和ChildClass,添加關鍵字 virtual 和 override,具體代碼如下:

Code
public?class?BaseClass
????
{
????????
public?BaseClass()
????????
{
????????????Console.WriteLine(
"Base?Class?Constructor");
????????}


????????
public?virtual?void?SayHello()
????????
{
????????????Console.WriteLine(
"Hello,?everyone,?I'm?base?class.");
????????}

????}


????
public?class?ChildClass?:?BaseClass
????
{
????????
public?ChildClass()
????????
{
????????????Console.WriteLine(
"Child?Class?Constructor");
????????}


????????
public?override?void?SayHello()
????????
{
????????????Console.WriteLine(
"Hello,?everyone,?I'm?child?class.");
????????}

????}


????
public?class?Test
????
{
????????
public?static?void?Main(string[]?args)
????????
{
????????????BaseClass?child?
=?new?ChildClass();
????????????child.SayHello();
????????}

????}

將BaseClass的SayHello方法定義為虛方法,并在ChildClass中重寫它,在Main方法中,實例化一個ChildClass對象,指向BaseClass的引用,并調用SayHello方法,輸出結果如下:

?????Base Class Constructor?????

?????Child Class Constructor

?????Hello, everyone, I'm child class.

結論:如果用 virtual 和 ovrride關鍵字在父類中申明虛擬方法并在子類中重寫,那么重寫的方法將會覆蓋父類的方法(注意對比前面用new關鍵字隱藏父類方法的例子),這樣即便child變量指向的是BaseClass的引用實際調用的也是ChildClass的方法。

場景四:

?????在場景三的基礎上修改BaseClass如下:

Code
public?class?BaseClass
????
{
????????
public?BaseClass(string?test)
????????
{
????????????Console.WriteLine(
"Base?Class?Constructor?"?+?test);
????????}


????????
public?virtual?void?SayHello()
????????
{
????????????Console.WriteLine(
"Hello,?everyone,?I'm?base?class.");
????????}

????}

即修改BaseClass的構造函數為有參構造函數,這時候編譯將會出錯,提示說BaseClass不含有無參構造函數;有此我們可推斷出以下幾點:1 如果定義一個有參構造函數,將會覆蓋默認的無參構造函數;2 如果子類含有無參構造函數,那么父類一定要含有無參構造函數,真的是這樣嗎?為了驗證我們的想法,接著在BaseClass中添加一個無參構造函數,代碼如下:

Code
public?class?BaseClass
????
{
????????
public?BaseClass()
????????
{
????????????Console.WriteLine(
"Base?Class?Constructor");
????????}


????????
public?BaseClass(string?test)
????????
{
????????????Console.WriteLine(
"Base?Class?Constructor?"?+?test);
????????}


????????
public?virtual?void?SayHello()
????????
{
????????????Console.WriteLine(
"Hello,?everyone,?I'm?base?class.");
????????}

????}

輸出結果與場景三一致,這似乎驗證了前面的猜測,那么試一下以下代碼:

?

Code
public?class?BaseClass
????{
????????
public?BaseClass(string?test)
????????{
????????????Console.WriteLine(
"Base?Class?Constructor?"?+?test);
????????}

????????
public?virtual?void?SayHello()
????????{
????????????Console.WriteLine(
"Hello,?everyone,?I'm?base?class.");
????????}
????}

????
public?class?ChildClass?:?BaseClass
????{
????????
public?ChildClass()?:?base("test")
????????{
????????????Console.WriteLine(
"Child?Class?Constructor");
????????}

????????
public?override?void?SayHello()
????????{
????????????Console.WriteLine(
"Hello,?everyone,?I'm?child?class.");
????????}
????}

????
public?class?Test
????{
????????
public?static?void?Main(string[]?args)
????????{
????????????BaseClass?child?
=?new?ChildClass();
????????????child.SayHello();
????????}

?

輸出結果如下:

  Base Class Constructor test ?

?????Child Class Constructor

?????Hello, everyone, I'm child class.

可以看出,雖然父類沒有無參構造函數,但只要子類無參構造函數顯示調用了父類的有參構造函數,同樣可以完成子類的實例化,由此我們可以做出結論:子類實例化之前必須先實例化父類,既可以通過隱式調用父類無參構造函數(所謂隱式,就是指編譯器自動完成),也可以通過顯式調用父類構造函數完成。

?

總結

?????前面通過四個場景簡單描述了繼承的概念,主要有以下幾點:

?????1 子類實例化的時候必須先調用父類的構造函數,默認會調用它的無參構造函數;

?????2 如果父類沒有定義無參構造函數,子類構造函數必須顯式地調用父類的有參構造函數;也就是說,子類實例化之前,必須先實例化父類。

?????3 如果子類出現了與父類同名的方法,并且沒有用virtual override重寫,那么將會隱藏而不會覆蓋父類的方法;

?????4 如果子類用override關鍵字重寫了基類的virtual方法,那么子類的方法將會覆蓋基類的方法。

轉載于:https://www.cnblogs.com/lemonade/archive/2008/11/28/1343494.html

總結

以上是生活随笔為你收集整理的浅谈继承的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 中文字幕mv| 欧美激情在线免费观看 | 国产精品久久综合 | 一区二区在线免费观看 | 久久久久久久人妻无码中文字幕爆 | 亚洲av无码国产精品久久久久 | 免费一级a毛片夜夜看 | 免费成人在线电影 | 亚洲成人精品一区 | 波多野结衣办公室33分钟 | 日韩不卡视频在线观看 | 国产精品vip | 国产欧美一区二区精品性色99 | 国产精品热久久 | 欧美日韩国产中文 | 成人免费在线小视频 | 波多野结衣欲乱上班族 | www.亚洲欧美| 欧美精品午夜 | 国产精品怡红院 | 久久无码视频网站 | 亚洲AV无码久久精品国产一区 | av青青草 | 国内精品99 | 欧美色吊丝 | 久久久噜噜噜久久中文字幕色伊伊 | 美女精品视频 | 青草伊人久久 | 中文字幕资源网 | 精品日韩一区二区 | 乱精品一区字幕二区 | 偷拍自拍一区 | 精品无码久久久久久久久成人 | 国产探花一区二区 | 国产真实乱人偷精品人妻 | 白丝一区| 国产精品1区2区 | 毛片视频免费 | 国产精品99re | 日韩av无码一区二区三区不卡 | 精精国产xxxx视频在线 | 国产精品久久中文字幕 | 欧美久久99 | 久久精品麻豆 | 国产一区精品视频 | 人与动物2免费观看完整版电影高清 | 浪浪视频在线观看 | 中文成人无字幕乱码精品区 | 1024精品一区二区三区日韩 | 激情欧美在线 | 欧美a v在线 | 亚洲一区天堂 | 久草99| 国产精品推荐 | 国产综合第一页 | 国产日韩欧美精品一区 | 色婷婷在线观看视频 | 国产懂色av | 成人三级在线看 | 国产一级一片免费播放放a 丁香六月色 | 欧美极品少妇xxxxⅹ喷水 | 一区二区在线免费看 | 欧美精品一区二区三区四区五区 | 人人爽人人爽人人片av | 麻豆三级视频 | 美女扒开内裤让男人桶 | 国产视频久久久久久 | 超鹏在线视频 | 一级黄av| 欧美h视频在线观看 | 亚洲精品一区二区二区 | 免费观看黄一级视频 | 欧美夜夜| 穿情趣内衣被c到高潮视频 欧美性猛交xxxx黑人猛交 | www.youjizz.com亚洲 | 黄色美女大片 | av最新网| 久久日韩精品 | 草草影院欧美 | 亚洲精品视频在线看 | 男女福利视频 | 亚洲精品国产精品国自产观看 | 黄色一级一级 | 欧美三日本三级少妇99 | 免费观看成人毛片 | 一本色道久久综合精品婷婷 | 一道本久在线中文字幕 | 国产精品厕所 | 18禁裸乳无遮挡啪啪无码免费 | 99综合色| 国产精品夜夜夜爽张柏芝 | 性生交大片免费看狂欲 | 久久久高潮 | 人妻少妇偷人精品久久性色 | 日韩高清一二三区 | 日本精品一区在线观看 | 高清日韩一区 | 天天干视频在线观看 | 欧美激情69 |