——摘自rocky ren
派生類隱式獲得基類的除建構函式和析構函式以外的所有成員。
派生類只能有乙個直接基類,所以c#
並不支援多重繼承,但乙個基類可以有多個直接派生類。
繼承是可以傳遞的。即:
如果 classb
派生出
classc
,classa
派生出
classb
,則 classc
會繼承
classb
和 classa
中宣告的成員。
class a
",sum);}}
class b : a
", minus);
this.sum(3, 4);}}
class inheritancetest1
}結果:i am b ,my minus=-1
i am a ,my sum = 7
試想一下,當基類sum
()方法是私有時,派生類還會繼承該方法嗎?
經過本人測試,沒有在b
類找到該方法,那麼是不是它就沒有被繼承呢?其實不是的,私有成員其實已經被繼承了,
但是它們卻不可以被訪問,因為私有成員只能被宣告它們的類或結構體中才可訪問,所以看上去像是沒有被繼承。
如果我們想降低訪問基本,我們可以把基類sum
()方法定義為
protected
。能夠阻止某個類被其他類繼承嗎?
答案是可以的,c#
提供了乙個
sealed
修飾符,此修飾符會阻止其他類從該類繼承。
sealed class a
",sum);}}
class b : a
", minus);
this.sum(3, 4); //編譯器會報錯 }}
前面說過,派生類隱式獲得基類的除建構函式和析構函式以外的所有成員。
那麼我們該如何獲得基類的建構函式和自身的建構函式呢?
我們知道基類的初始化工作由基類的建構函式完成,派生類的初始化工作則有派生類的建構函式完成,
但是這樣就產生了派生類建構函式的執行順序問題。
當基類沒有建構函式,派生類也沒有建構函式時,派生類新曾成員的初始化工作由其他公有函式來完成。
public class a
" ,test);}}
class b : a
", i);}}
class inheritancetest1
}結果:i am i=3
如果只有派生類定義建構函式時,只需構造派生類物件即可。物件的基類部分使用預設建構函式來自動建立。
當基類和派生類都定義有建構函式時,那麼執行順序會怎樣呢?
如果基類中是沒有引數的建構函式,那麼他可以隱式的被派生類執行,也就是說,派生類根本不需要包含建構函式
如果基類中是沒有引數的建構函式,在派生類中可以自定義有引數的建構函式
public class a
", test);}}
class b : a
class inheritancetest1
}結果:i am a
公有預設建構函式
,test=5
由此可以看見,基類的建構函式被執行,在派生類中被呼叫。
如果基類定義了帶有引數的建構函式,那麼此建構函式必須被執行,且在派生類中實現該建構函式,此時我們可以使用base
關鍵字class a
", test);}}
class b : a
",j);}}
class inheritancetest1
}結果:i am a
公有有參建構函式 ,
test=1
i am b 公有有參建構函式,
j=1由此可見: 派生類隱式執行基類中帶有引數的建構函式,在程式中基類定義了帶有引數的建構函式,
在其派生類中被繼承,並使用base關鍵字呼叫基類中的建構函式來傳送引數。
我們可以從**中看到在建立派生類的物件後,程式首先執行的是基類的建構函式中的內容,然後才是派生類中的內容。
如果派生類的基類也是派生類,則每個派生類只需負責其直接基類的構造,不負責間接基類的構造,
並且其執行建構函式的順序是從最上面的基類開始的,直到最後乙個派生類結束。
關於繼承的問題
繼承,我這裡只說方法,繼承關心的是我從父類繼承來的東西有不是擁有的東西 簡單地說也就是能使用的東西 1。訪問修飾符為private的方法不能被繼承,而是被隱藏,在子類中可以寫乙個跟父類訪問修飾符為private方法一樣的方法,這裡不存在覆蓋問題,因為方法被隱藏,根本就沒有被繼承,所以不存在覆蓋問題,...
關於原型的繼承問題
原型作用 資料共享,目的 為了節省記憶體空間,原型作用 繼承 目的是 為了節省記憶體空間原型繼承 改變原型的指向 借用建構函式繼承 主要解決屬性的問題 組合繼承 原型繼承 借用建構函式繼承function person name,age,weight person.prototype.sayhi f...
關於static的繼承問題
今天研究了一下被static修飾的變數和方法,在子類中繼承的問題,網上也看了別人的部落格,自己也動手試了一下 如下 1 父類 2package com.xujingyang.test 34 public class father 11public void nostaticmethod 14 151...