這幾天,專案比較空一點,正在重點看一下c#基礎語法,感覺物件導向那一部分,有些地方還是滿疑惑的。
參考了《c#高階程式設計》第四版 第3和4章 邊看邊總結了點筆記
c#中的繼承(第4章 繼承)
1.繼承的型別
(1)實現繼承
表示乙個型別派生於乙個基型別,擁有該基型別的所有成員欄位和函式
(2)介面繼承
表示乙個型別只繼承了函式的簽名,沒有繼承任何實現**。
介面繼承通常被看作提供了一種契約,讓型別派生於介面,來保證為客戶提供某個功能
(3)多重繼承
c#不支援多重繼承,c#允許型別派生於多個介面
system.object是乙個公共基類,所以每個c#類(除object),都有乙個基類,還可以有任意多個基介面
(4)定義結構和類的總結:
結構總是派生於system.valuetype,還可以派生於任意多個介面
類總是派生於使用者選擇的另乙個類,還可以派生於任意多個介面
2.實現繼承
class a:b a類派生於b類
set}
c#中虛方法可以在派生類中重寫,在呼叫方法時,會呼叫物件型別的合適方法
派生類重寫虛方法時要使用override關鍵字顯式宣告
成員欄位和靜態方法都不能宣告為virtual
(2)隱藏方法
如果簽名相同的方法在基類和派生類中都宣告,但該方法沒有宣告為virtual和override
那麼派生類方法會隱藏基類方法
同時c#會給出警告,使用new關鍵字宣告要隱藏乙個方法
在派生類方法前使用new,則可以關閉這個警告
當派生類方法前使用了new,而實際上該方法並沒有覆蓋基類的方法,那麼編譯器也會發出警告
(3)呼叫方法的基類版本
派生類中呼叫方法的基類版本:base.methodname()
也可以使用base() 來呼叫基類建構函式
以上主要討論了基類,派生類的方法,其規則也使用於屬性
(4)抽象類和抽象方法
abstract關鍵字
抽象類不能例項化
抽象方法沒有實現**,必須在非抽象的派生類中重寫(實際上抽象方法也是虛的,但不需要提供virtual)
如果類包含抽象方法,那麼該類也是抽象的,也必須宣告為抽象的 abstract
(5)密封類和密封方法
sealed關鍵字
對於類來說表示不能繼承該類
對於方法來說表示不能重寫該方法
注意:在方法上使用sealed是沒有意義的,除非該方法本身是某個基類上另乙個方法的重寫形式
如:class myclass
//methoda方法在基類中已經是乙個重寫形式
}//這裡的sealed 關鍵字其實就是確保了methoda在此處重寫的**是最終版本,其它人不能再重寫它了
class towclass:myclss
//錯誤,因為methoda方法不能被重寫
}如定義乙個新方法不想讓別人重寫,則首先就不要宣告為virtual
(6)派生類的建構函式
當沒有為類定義任何顯式的建構函式,編譯器會為所有的類提供預設的建構函式,並且能夠很好的
解決類層次結構中的所有問題
基類abstract class basea
子類class a:basea
描述例項化派生類時發生的情況:
假定預設的建構函式在整個層次結構中使用
編譯器首先找到它試圖例項化的類的建構函式,是a,而這個預設 a建構函式首先是為其直接基類basea執行預設
建構函式——》basea建構函式同樣繼續為其直接基類system.object執行預設建構函式
而system.object沒有任何基類,其建構函式執行,並把控制返回basea——》執行basea建構函式,將name初始化為null
控制權返回給a——》執行a建構函式,將id初始化為0,並退出
注意:建構函式的呼叫順序是先呼叫system.object,再按照層次結構由上向下進行,直到編譯器要例項化的類為止
每個建構函式都初始化它自己類中的字段
新增建構函式
第一:在層次結構中新增無引數的建構函式(用無引數的建構函式替換預設建構函式)
比如,要將上述basea class中的name初始化為"no name"
public abstract class basea }
當然針對此類,:base() 則可以不寫
因為編譯器在建構函式的「
}這樣的情況,則在例項化a的時候,編譯出錯,因為編譯器為a生成的預設建構函式會試圖呼叫無引數的
basea建構函式,而由於basea中定義了帶引數的構造,所以basea中沒有預設的建構函式了.
因此,需要為派生類也提供乙個帶引數的建構函式來避免錯誤
如:class a:basea
}第三:過載建構函式和乙個類的層次結構
如:class a:basea
//建構函式2
public a(string name):this(name,"none")
}當執行 a a=new a("hello");就會呼叫 建構函式2 ,之後立即把控制權傳給對應的 建構函式1,這個函式帶2個引數
分別是"hello"和"none";在這個建構函式中依次把控制權傳給basea構造,該構造帶有1個引數——字串"hello".
然後繼續——》system.object預設建構函式
開始執行建構函式:首先system.object建構函式——》執行basea建構函式,初始化name
——》2個引數的a構造,初始化refname為"none"——》執行1個引數的a構造(什麼也不做)
在為類編寫自己的建構函式時遵循上述規則,則可以避免任何問題,順利初始化
物件導向程式設計(C )學習筆記一
類 class 是對結構體struct的增強,也是用於自定義型別的。struct object class object 將關鍵字struct改為class,增加訪問修飾符public object obj obj.a 11 obj.b 12 obj.c 13.0 obj.d 14.0 class ...
C 學習筆記(物件導向)
protected 受保護的 用protected宣告的成員稱為受保護的成員,它不能被類外訪問,但是可以被派生類的成員函式訪問 在類體中,既不寫關鍵字private,又不寫public,則預設為private 宣告類的方法是由宣告結構體型別的方法發展來的 在類體中直接定義函式時,不需要在函式名前邊加...
C 學習筆記 物件導向程式設計
1.什麼是類 物件和成員?類 乙個類包含很多的物件。比如人類就是乙個類,張 三 李四等是人類的物件,這些物件擁有人類共同的功能和資料,如身高 體重 年齡等,而具體化這些資料我們可看做是人類的成員變數。所以類是由若干個變數和相關函式組成,而物件則擁有這些變數和函式。2.如何宣告乙個類?類只有先宣告才能...