關於父類引用指向子類物件

2022-01-17 13:35:23 字數 2836 閱讀 5554

例如: 有以下2個類

public  class  father

public class son : father

father f=new son();

這種用法叫做「父類引用指向子類物件,或者叫「父類指標指向子類物件」,指的是定義乙個父類的引用,而它實際指向的是子類建立的物件。

好處是什麼?

下面做幾個測試,

第一種  ,父類變數,呼叫 屬性  例如下面的  f.age   是乙個父類的變數呼叫了屬性,問題是這裡的屬性是父類的?還是子類的? 答案是父類的屬性

class program

public class father

public class son : father

}

小結論(1): 當用父類的變數呼叫屬性的時候,取決於宣告的型別(「=」左邊是什麼型別),而不是後面例項化的型別

第二種 ,父類變數,呼叫 方法 (父類的方法和子類的方法  一模一樣,子類並無重寫)

public  class  father

,名字是",age,name));}}

public class son : father

,名字是", age, name));}}

static void main(string args)

小結論(2): 當子類和父類的方法完全相同時,呼叫的時候取決於宣告的型別(「=」左邊),而不是後面例項化的型別。

第三種 ,父類變數,呼叫 方法 (父類的方法和子類的方法 一模一樣 ,但是父類的方法加 virtual , 子類不重寫)

小結論(3):如果父類有virtual虛方法,但是子類並沒有重寫的話,那麼  同上面的小結論(2)一樣,呼叫的時候,取決於宣告的型別(「=」的左邊),而不是例項化的型別

第四種 ,父類變數,呼叫 方法 (父類的方法和子類的方法 一模一樣 ,但是父類的方法加 virtual ,子類重寫)

小結論(4):重寫以後,呼叫哪個類的方法取決於例項化的型別(「=」右邊)或者是轉換後最終的型別

第五種 ,父類變數,呼叫 方法 (父類的方法和子類的方法 一模一樣 ,但是父類的方法加 virtual ,子類重寫)

父類變數指向子類的例項,但是我們直接呼叫父類變數下的屬性,會輸出子類的屬性?還是父類的屬性?答案是父類的屬性.

那如果再繼續呼叫方法的話,是呼叫父類的方法?還是子類的方法?答案是,如果是虛方法,子類有重寫,就呼叫子類的,子類沒有重寫,就呼叫父類的.

小結論(5) : 如果子類方法裡面想呼叫父類的屬性或者是方法,使用 base 關鍵字

結論:

1:當用父類的變數呼叫屬性的時候,取決於宣告的型別(「=」左邊是什麼型別),而不是後面例項化的型別

例如 輸出 f.age 就是輸出父類的屬性 ,而不是子類的屬性

2:當子類和父類的方法完全相同時,呼叫的時候取決於宣告的型別(「=」左邊),而不是後面例項化的型別。

也就是子類沒有重寫的時候. f.sayhi 就是呼叫的父類的sayhi ,而不是子類的sayhi

3 如果子類有重寫(override)父類的方法,那麼 父類變數呼叫方法的時候,就變成使用 子類的方法.

也就是子類有override的時候,f.sayhi 就是呼叫子類的sayhi

4:如果想在子類裡面訪問父類的屬性或者是方法,使用 base 關鍵字

c#中new和override的區別;abstract

當父類裡面有 virtual 方法的時候,子類可以使用 override 進行重寫.  那麼  f.sayhi  就變成呼叫子類的sayhi

不論父類的方法有沒有virtual,子類都可以在同名的方法上加乙個new表示這是子類自己的方法,那麼父類的方法就會被隱藏起來, f.sayhi 就會變成 呼叫父類的sayhi,因為子類並沒有override. 如果這個時候,把new去掉,效果也是一樣的,f.sayhi 也是呼叫父類的sayhi, 判斷是否呼叫子類的方法,就看子類是否有override重寫.

//在c#中,override和new都會覆蓋父類中的方法。那它們兩者之前有什麼區別呢? //override是指「覆蓋」,是指子類覆蓋了父類的方法。子類的物件無法再訪問父類中的該方法(當然了,在子類的方法中還是可以通過base訪問到父類的方法的)。

//new是指「隱藏」,是指子類隱藏了父類的方法,當然,通過一定的轉換,可以在子類的物件中訪問父類的方法。

c#類的初始化順序

子類的靜態成員變數,子類的普通成員,父類的靜態成員,父類的普通成員

namespace 類的初始化順序

public class father

public class son : father}}

首次訪問:(在此沒有顯示的寫出類中的構造方法) 

順序:子類的靜態字段==》子類靜態構造==》子類非靜態字段==》父類的靜態字段==》父類的靜態構造==》父類的非靜態字段 

==》父類的建構函式==》子類的建構函式 

非首次訪問:順序是一樣的,只不過少了中間靜態欄位和構造的過程 

對於靜態變數與靜態建構函式而言, 無論對乙個類建立多少個例項,它的靜態成員都只有乙個副本。 也就是說,靜態變數與靜態建構函式只初始化一次(在類第一次例項化時)

關於父類引用指向子類物件

很多人在初次接觸設計模式的時候,最大的疑惑莫過於碰到這樣的句子 父類animal和子類dog animal a2 new dog 這是什麼玩意兒?究竟有什麼用途,我直接用子類物件不就完了?我們就來解釋一下 這是什麼玩意兒?re 這種用法叫做 父類引用指向子類物件 跟繞口令似的 或者叫 父類指標指向子...

關於父類引用指向子類物件

父類的引用指向子類的物件 當子類繼承的父類時子類會繼承父類的屬性以及方法,當用父類去接收子類物件時 1.如果子類中含有與父類同名屬性時,雖然物件中存在子類中的資料,但是無法去呼叫,可以通過在子類中重寫get,set方法去獲取資料。2.如果子類中沒有重寫父類的方法時,無法用物件去呼叫子類的屬性以及方法...

父類引用指向子類物件

要理解多型性,首先要知道什麼是 向上轉型 我定義了乙個子類cat,它繼承了animal類,那麼後者就是前者是父類。我可以通過 cat c new cat 例項化乙個cat的物件,這個不難理解。但當我這樣定義時 animal a new cat 這代表什麼意思呢?很簡單,它表示我定義了乙個animal...