一.C#中類的定義
1.類的定義方法:
<accessType> class<className>:<baseClass>,<interface>
{
//class member;
}
注:
1).默認情況下類的訪問權限是內部的(internal),只有當前項目中才能訪問它
2).類還還有抽象類(abstract修飾,不能實例化、只能繼承、可以有抽象成員)和與之對立的密封類(sealed修飾,不能繼承),這兩種類都有public和internal類型的
3).一個類只能有一個基類
4).如果繼承了一個抽象類,必須實現所繼承的所有抽象成員(除非其基類也是抽象類)
5).子類的可訪問性不能高於基類,如子類是public,基類不能是internal的
6).支持接口的類必須實現所有的接口成員,但如果不想使用給定的接口,則可以提供一個“空”的實現方式(沒有函數代碼)
7).定義接口方式與定義類類似,用關鍵字interface
8).定義接口不能用abstract和sealed修飾
2.System.Object
因爲所有的類都繼承了System.Object,所有所有的類都能夠訪問Sytem.Object的Protect和Public成員。也可以重寫其方法
3.構造函數和析構函數
C#定義類時,常常不需要定義構造函數和析構函數,編譯器會自動添加,但有可在必要的時候添加。
1).構造函數定義方法:
<accessType> <className>(paramater1,…)
{
//Constructor code;
}
1>.構造函數與類同名
2>.默認構造函數沒有參數,且訪問控制權限爲public
3>.構造函數是用來創建類的實例的,但也可以有Internal的構造函數,這個構造函數不能創造類的實例
4>.構造函數可以有多個,參數集不能重複
2)繼承關係中構造函數的調用
1>.子類實例化時先調用的是父類的默認構造函數,再調用自己的默認構造函數和有參構造函數。
2>.父類的有參構造函數用base關鍵字調用
3).靜態構造函數
1>.靜態構造函數一般用於類的靜態成員的初始化
2>.靜態構造函數不能有參數,不能有修飾符
3>.靜態構造函數在類被加載時自動被調用,不能單獨調用
4>.靜態構造函數最多隻能被調用一次,即一個類被實例化多次也只執行一次靜態構造函數
5>.靜態構造函數在類的任何靜態變量初始化之前和被使用前執行;在任何實例變量被分配之前執行
2).析構函數的定義
~ <className>()
{
//Destructor body;
}
3).構造函數的執行序列
1>.實例化繼承子類,必須先實例化其基類,要實例化其基類就得先實例化其基類的基類,直到實例化Sytem.Object爲止
2>.除非明確指示,否則使用期默認構造函數。上述一連串不論子類用的是否默認構造函數,基類一定用其默認構造函數
3>.實例化子類時如果要使用基類的非默認構造函數,可用base(<paramater>)關鍵字指定使用固定參數的構造函數
5.類庫項目
如果一個項目只包含類(以及其他相關類的定義,但沒有入口點),該項目就稱爲類庫。類庫項目被編譯爲.dll文件
將類庫項目加入參考,並用using語句寫入主程序即可被引用。..
6.接口和抽象類
1).二者的相同之處
1>.都包含可以由派生類繼承的成員
2>.都不能直接實例化,但可以聲明這些類型的變量。然後把繼承這兩種類型的對象指定給他們的變量,同過變量來使用其成員
2).二者的不同之處
1>.類只能直接繼承於一個抽象類(可用繼承鏈繼承多個類),但類可以有多個接口
2>.抽象類可以擁有抽象成員(沒有代碼體,且必須在派生類中實現,除非派生類本省也是抽象的)和非抽象成員;接口成員必須被使用它的類實現
3>.接口成員的定義傾向於公共的,但抽象類的成員可以是私有的、受保護的、內部的
4>.接口不能包含字段、構造函數、析構函數、靜態成員或常量
7.結構和類
結構:值類型,把結構A賦值給結構B,是指把結構A中的內容全部複製到結構B中
類:引用類型,把類A的對象賦值給類B的對象,是指把類A的對象在內存中的地址複製給類B的對象