C#中面向物件程式設計技術的應用(一)
1,抽象類
如果一個類不與具體的事務聯絡,而只是表達一種抽象的概念,僅是作為其派生類的一個基類,這樣的類就是抽象類。在抽象類中宣告方法時,如果加上abstract關鍵字,則為抽象方法。
抽象類主要用於提供多個派生類可共享的基類的公共定義,它與非抽象類的主要區別如下:
1,抽象類不能被例項化
2,抽象類可以包含抽象成員,但非抽象類中不可以
3,抽象類不能被密封
C#中宣告抽象類時需要使用關鍵字abstract關鍵字,語法格式如下:
【訪問修飾符】abstract class【類名】:【基類或介面】
{
類成員
}
宣告抽象類時,除了abstract關鍵字、class關鍵字和類名外,其它的都是可選項。
例子:
1public abstract class Roll 2 { 3 private int r = 0; 4 public int R 5 { 6 get 7 { 8 return r; 9 } 10 set 11 { 12 r = value; 13 }14 } 15 16 public abstract double Area(); 17 } 18 19 public class CalaArea : Roll 20 { 21 public override double Area() 22 { 23 return Math.PI * R * R; 24 } 25 }
抽象類和介面的區別
1,它們的派生類只能繼承一個基類,即只能直接繼承一個抽象類,但可以繼承任意多個介面
2,抽象類中可以定義成員的實現,但介面中不能
3,抽象類中可以以包含欄位、建構函式、解構函式、靜態成員或常量等,介面中不能
4,抽象類中的成員可以是私有的(只要它們不是抽象的)、受保護的、內部的或受保護的內部成員(受保護的內部成員只能在應用程式的程式碼或派生類中訪問),但介面中的成員必須是公共的。
2,介面
介面是一種用來定義程式的協議,它描述可屬於任何類或結構的一組相關行為,可以把它看成是實現一組類的模板。介面可由方法、屬性、事件和索引器或4種成員型別的任何組合構成,但不能包含欄位。
類和結構可以像類繼承基類一樣從介面繼承,但是可以繼承多個介面。當類或結構繼承介面時,它繼承成員定義但不繼承實現。若要實現介面成員,類或結構中對應成員必須是公共的、非靜態的,並且與介面成員具有相同的名稱和簽名。類或結構的屬性和索引器可以為介面中定義的屬性或索引器定義額外的訪問器。例如,介面可以宣告一個帶有get訪問器的屬性,而實現該介面的類可以宣告同時帶有get和set訪問器的同一屬性。但是,如果屬性或索引器使用顯示實現,則訪問器必須匹配。
介面也可以繼承其他介面,類可以通過其繼承的基類或介面多次繼承某個介面,在這種情況下,如果將該介面宣告為新類的一部分,則類只能實現給介面一次。如果沒有將繼承的介面宣告為新類的一部分,其實現將由宣告它的基類提供。基類可以使用虛擬成員實現介面成員。在這種情況下,繼承介面的類可以通過重寫虛擬成員來更改介面行為。
介面具有以下特徵:
1,介面類似於抽象基類,繼承介面的任何非抽象型別都必須實現介面的所有成員
2,不能例項化介面
3,介面可以包含事件、索引器、方法和屬性
4,介面不包含方法的實現
5,類和結構可從多個介面繼承
6,介面自身可以從多個介面繼承
C#中使用interface關鍵字宣告介面,其語法格式如下:
【修飾符】interface 【介面名稱】:【繼承的介面列表】
{
介面內容
}
注意:
1,介面宣告時,通常以大寫字母“T”開頭
2,介面宣告時,除了interface 關鍵字和介面名稱外,其他都是可選項
3,可以使用new、pubilc、protected、internal和private等修飾符宣告介面,但介面成員必須是公共的
介面通過類的繼承來實現,一個類雖然只能繼承一個基類,但可以繼承任意多個介面。宣告實現介面的類時,需要在基類列表中包含類所實現的介面的名稱。
C#中實現繼承的語法格式如下:
class DerviedClass:BaseClass{}
例子:
1 /// <summary> 2 /// 宣告一個介面,用於定義Speak方法,而具體Speak方法功能的實現是在類中進行 3 /// </summary> 4 interface IselectLanguage 5 { 6 void Speak(string str); 7 } 8 9 /// <summary> 10 /// 如果與中國人對話,則說漢語 11 /// </summary> 12 class C_SpeakChinese : IselectLanguage 13 { 14 15 public void Speak(string str) 16 { 17 18 MessageBox.Show("您對中國友人說:"+str,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information); 19 } 20 } 21 /// <summary> 22 /// 如果與美國人對話,則說英語 23 /// </summary> 24 class C_SpeakEnglish : IselectLanguage 25 { 26 27 public void Speak(string str) 28 { 29 30 MessageBox.Show("您對美國友人說:" + str, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); 31 } 32 }
3,密封類
密封類可以用來限制擴充套件性,如果密封了某個類,則其它類不能從該類繼承。如果密封了某個成員,則派生類不能重寫該成員的實現。預設情況下,不應該密封類和成員。密封可以防止對庫的型別和成員進行自定義,但也會影響某些開發人員對可用性的認識。
C#中使用密封類時,如果類滿足如下條件,則應該將其密封。
1,類是靜態類
2,類包含帶有安全敏感資訊的繼承的受保護成員
3,類繼承多個虛成員,並且密封每個成員的開發和測試開銷明顯大於密封整個類
4,類是一個要求使用反射進行快速搜尋的屬性,密封屬性可提高反射在檢索屬性時的效能
在C#中宣告密封類時需要使用sealed關鍵字,具體語法格式如下:
【訪問修飾符】sealed class 【類名】:【基類或介面】
{
//類成員
}
例子:
1 /// <summary> 2 /// 通過sealed關鍵字宣告密封類,防止類被繼承,有效保護重要資訊 3 /// </summary> 4 private sealed class myClass { 5 6 private string name = "";//string型別變數,用來記錄使用者名稱 7 private string pwd = "";//string型別變數,用來記錄用密碼 8 9 /// <summary> 10 /// 使用者名稱 11 /// </summary> 12 public string Name { 13 14 get 15 { 16 return name; 17 } 18 set 19 { 20 name = value; 21 } 22 } 23 /// <summary> 24 /// 密碼 25 /// </summary> 26 public string Pwd 27 { 28 29 get 30 { 31 return pwd; 32 } 33 set 34 { 35 pwd = value; 36 } 37 } 38 }
使用密封類時注意一下三點:
1,密封類不能作為基類被繼承
2,在密封類中不能宣告受保護成員或虛成員,因為受保護成員只能從派生類進行訪問,而虛成員只能在派生類中重寫
3,由於密封類的不可繼承性,因此密封類不能宣告為抽象的