例如: 有以下2個類
public class fatherfather f=new son();public class son : father
這種用法叫做「父類引用指向子類物件,或者叫「父類指標指向子類物件」,指的是定義乙個父類的引用,而它實際指向的是子類建立的物件。
好處是什麼?
下面做幾個測試,
第一種 ,父類變數,呼叫 屬性 例如下面的 f.age 是乙個父類的變數呼叫了屬性,問題是這裡的屬性是父類的?還是子類的? 答案是父類的屬性
class program小結論(1): 當用父類的變數呼叫屬性的時候,取決於宣告的型別(「=」左邊是什麼型別),而不是後面例項化的型別public class father
public class son : father
}
第二種 ,父類變數,呼叫 方法 (父類的方法和子類的方法 一模一樣,子類並無重寫)
public class father小結論(2): 當子類和父類的方法完全相同時,呼叫的時候取決於宣告的型別(「=」左邊),而不是後面例項化的型別。,名字是",age,name));}}
public class son : father
,名字是", age, name));}}
static void main(string args)
第三種 ,父類變數,呼叫 方法 (父類的方法和子類的方法 一模一樣 ,但是父類的方法加 virtual , 子類不重寫)
小結論(3):如果父類有virtual虛方法,但是子類並沒有重寫的話,那麼 同上面的小結論(2)一樣,呼叫的時候,取決於宣告的型別(「=」的左邊),而不是例項化的型別
第四種 ,父類變數,呼叫 方法 (父類的方法和子類的方法 一模一樣 ,但是父類的方法加 virtual ,子類重寫)
小結論(4):重寫以後,呼叫哪個類的方法取決於例項化的型別(「=」右邊)或者是轉換後最終的型別
第五種 ,父類變數,呼叫 方法 (父類的方法和子類的方法 一模一樣 ,但是父類的方法加 virtual ,子類重寫)
父類變數指向子類的例項,但是我們直接呼叫父類變數下的屬性,會輸出子類的屬性?還是父類的屬性?答案是父類的屬性.
那如果再繼續呼叫方法的話,是呼叫父類的方法?還是子類的方法?答案是,如果是虛方法,子類有重寫,就呼叫子類的,子類沒有重寫,就呼叫父類的.
小結論(5) : 如果子類方法裡面想呼叫父類的屬性或者是方法,使用 base 關鍵字
結論:
1:當用父類的變數呼叫屬性的時候,取決於宣告的型別(「=」左邊是什麼型別),而不是後面例項化的型別c#中new和override的區別;abstract例如 輸出 f.age 就是輸出父類的屬性 ,而不是子類的屬性
2:當子類和父類的方法完全相同時,呼叫的時候取決於宣告的型別(「=」左邊),而不是後面例項化的型別。
也就是子類沒有重寫的時候. f.sayhi 就是呼叫的父類的sayhi ,而不是子類的sayhi
3 如果子類有重寫(override)父類的方法,那麼 父類變數呼叫方法的時候,就變成使用 子類的方法.
也就是子類有override的時候,f.sayhi 就是呼叫子類的sayhi
4:如果想在子類裡面訪問父類的屬性或者是方法,使用 base 關鍵字
當父類裡面有 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...