c 繼承與建構函式的呼叫

2021-10-06 22:33:59 字數 2581 閱讀 9588

​ 本片文章主要介紹在學習c#物件導向——繼承,以及建構函式的繼承呼叫時遇到的一些比較難理解的問題,希望對剛入門的朋友有一些幫助。

​ 繼承就是在類之間建立一種相交關係,使得新定義的派生類(子類)的例項可以繼承已有的基類(父類)的特徵和能力,而且可以加入新的特性或者是修改已有的特性建立起類的新層次。

​ 繼承是物件導向的主要特徵之一,它可以讓你的**重複使用,可以節省程式設計的時間,繼承就是就是在類之間建立一種相交關係,使得新定義的派生類可以繼承已有的基類的特徵和能力,而且可以加入新的特性或者是修改已有的特性建立起類的新層次。

​ 比如:你繼承了你爸爸的一些特徵,你爸爸是基類,你是派生類,你不僅有你爸爸的一些特徵,同時你還有屬於自己的一些習慣特徵。也就是說你跟你爸爸共同擁有的一種特徵,跟相同之處不同之處類似。

《訪問修飾符符》 class 《基類》

class 《派生類》 : 《基類》

​ (1)繼承是可傳遞的,如果c從b中派生,b又從a中派生,那麼c不僅繼承了b中宣告的成員,同樣也繼承了a中的成員,object類作為所有類的基類。

​ (2)派生類應當是對基類的擴充套件。派生類可以新增新的成員,但不能去除已經繼承的成員的定義。

​ (3)被private修飾過的類成員無法被派生類繼承。除此之外的其他成員(屬性和方法),都可以被繼承,都可以被派生類所訪問。

​ (4)派生類如果定義了與繼承而來的成員同名的新成員,就可以覆蓋已經繼承的同名成員,此時派生類不能訪問被覆蓋的成員。不過,使用new修飾符可以宣告具有相同名稱或簽名的新成員。

​ (5)c#不支援多重繼承,也就是說派生類只能從乙個類中繼承,但是可以通過介面實現多重繼承。

​ (6)類可以定義虛方法、虛屬性以及虛索引指示器,它的派生類能夠過載這些成員,從而實現類可以展示出多型性。

方法:通過 :base 來實現繼承和呼叫

例子:

class animal

}//基類的建構函式

class dog : animal

}

上邊的**等價於下邊的**

class animal

}//基類的建構函式

class dog : animal

}

說明:

​ 1、基類的無參建構函式會被派生類無條件的直接繼承和呼叫

​ 2、在繼承的時候是先呼叫父類的建構函式再呼叫子類的建構函式,意思就是說孩子有什麼解決不了的問題找爸爸,爸爸解決不了的問題再找爸爸的爸爸,也就是孩子爺爺。就是這麼個過程:先呼叫輩分大的建構函式,再呼叫輩分小的,一級一級往下呼叫,最終呼叫到本類中的建構函式。

​ 3、其實在派生類無參建構函式中base是預設存在的,但是,因為是無參的,它的括號當中沒有實際的引數,所以給省略,也就是上邊的例子。

格式:

class 基類

//無參建構函式

public 基類(型別 引數1)//有參建構函式

}class 繼承類:基類

//無參建構函式

public 繼承類(型別 形數1,型別 形數2):base(實參1,實參2)//有參建構函式

}

案例:
//基類

class animal

}//派生類

class dog : animal

}//外部呼叫

class program

}

說明:

​ 1、當父類的建構函式為有參的時候,那麼它此時構造方法括號中的引數是形參,但是它必須要給定乙個實參來接受,但是這個實參從何而來?

​ 2、當父類建構函式為有參的時候,那麼子類的建構函式也必須是有引數的,並且資料型別和個數要和父類的建構函式型別和個數相同,名稱可以不同。

​ 3、因為子類的形參它需要接收實參,那麼我們就可以在例項化子類的時候給它實參,也就是下邊的**

dog dog = new dog("哈士奇","白黑相間","骨頭");//例項化dog物件,並通過建構函式給子類的建構函式傳值
​ 4、值傳給子類的建構函式,但是此時父類沒有呀,我想要繼承父類,父類也應該有引數吧。

​ 所以,這個時候就要通過:base來獲取子類的傳過來引數——實際的值(實參),並通過base把這個值傳給父類的建構函式,此時父類建構函式的值是不是就是子類獲取到的值呢?答案肯定就是嘛,因為是是子類給父類傳的實際引數嘛。同時建構函式的作用就是初始化成員變數,那麼子類傳給父類的值是不是就通過父類建構函式來初始化成員變數了呢,答案就肯定毫無疑問嘛。

public dog(string name, string color, string eat) : base(name, color, eat)

//通過base來獲取子類傳過來的實際值,並給父類傳過去,最後呼叫一下父類

總結:

​ 1、不管建構函式有沒有引數,子類都會去呼叫這個父類的建構函式

​ 2、當呼叫時,基類的建構函式總會比它的子類先呼叫或者輸出

​ 3、有參時,在這裡base的作用是獲取子類引數的實際值,以及給父類傳值

​ 4、無參時,base其實是被省略掉了

C 繼承與建構函式的呼叫

1 例項化父類時,可以使用new子類,執行建構函式順序為 先執行父類建構函式,再執行子類建構函式。2 例項化子類時,只可以new子類,執行順序同上。3 父類例項化後,只能執行父類的方法,獲得父類的屬性等。4 例項化子類後,可同時執行子類和父類的方法和屬性,如同名方法,則執行子類的方法。我們看以下的 ...

C 繼承與建構函式的呼叫

1 例項化父類時,可以使用new子類,執行建構函式順序為 先執行父類建構函式,再執行子類建構函式。2 例項化子類時,只可以new子類,執行順序同上。3 父類例項化後,只能執行父類的方法,獲得父類的屬性等。4 例項化子類後,可同時執行子類和父類的方法和屬性,如同名方法,則執行子類的方法。我們看以下的 ...

C 繼承與建構函式的呼叫

1 例項化父類時,可以使用new子類,執行建構函式順序為 先執行父類建構函式,再執行子類建構函式。2 例項化子類時,只可以new子類,執行順序同上。3 父類例項化後,只能執行父類的方法,獲得父類的屬性等。4 例項化子類後,可同時執行子類和父類的方法和屬性,如同名方法,則執行子類的方法。我們看以下的 ...