面向對象的三大特性:封裝、繼承、多態。
1.封裝概念
封裝:每個對象都包含有它能進行操作的所有信息,這個特性稱為封裝。這樣的方法包含在類中,通過類的實例來實現。
2.封裝的優點
A.良好的封裝能夠減少耦合(比如實現界面和邏輯分離)
B.可以讓類對外接口不變,內部可以實現自由的修改
C.類具有清晰的對外接口,使用者只需調用,無需關心內部
D.因為封裝的類功能相對獨立,因此能更好的實現代碼復用
E.可保護代碼不被無意中破壞,通過私有字段等實現內部。注意:這里的代碼保護不是指代碼本身的加密,而是對不想外部更改的代碼通過私有實現。
封裝實例:我們單位養了一只價值800塊錢,黃色的的牧羊犬,有陌生人來的時候,就會叫幾聲,當然越是陌生程度越高,叫的次數越多。對這樣一個事務的處理上,可以利用面向對象的封裝特性,代碼實現如下:
1 /// <summary> 2 /// 狗狗類 3 /// </summary> 4 class Dog 5 { 6 string _dogName; 7 readonly Color _dogColor=Color.Yellow; 8 readonly double _dogPrice = 800.00; 9 int _shoutNumber; 10 11 /// <summary> 12 /// 構造函數 13 /// </summary> 14 /// <param name="dogName"></param> 15 public Dog(string dogName) 16 { 17 DogName = dogName; 18 } 19 20 /// <summary> 21 /// 狗狗名字 公有屬性 22 /// </summary> 23 public string DogName 24 { 25 get { return _dogName; } 26 set { _dogName = value; } 27 } 28 /// <summary> 29 /// 狗狗顏色 只讀屬性 (顏色一出生就是這個顏色,這里只提供只讀,當然這里不考慮染色) 30 /// </summary> 31 public Color DogColor 32 { 33 get { return _dogColor;} 34 } 35 /// <summary> 36 /// 狗狗價格 只讀屬性 (這是買來的價格,歷史是不可以修改的) 37 /// </summary> 38 public double DogPrice 39 { 40 get { return _dogPrice; } 41 } 42 43 /// <summary> 44 /// 狗叫的次數 (不同的陌生人來,叫的次數不同) 45 /// </summary> 46 public int ShoutNumber{ 47 set{_shoutNumber=value;} 48 get { return _shoutNumber; } 49 } 50 51 /// <summary> 52 /// 狗叫的方法 53 /// </summary> 54 public void Shout() 55 { 56 int i=0; 57 string ShoutNum=""; 58 do 59 { 60 ShoutNum += "旺!"; 61 i++; 62 } while (i <= ShoutNumber); 63 MessageBox.Show(ShoutNum); 64 } 65 }
上面的Dog類就是對狗狗的全部信息,包括它的價格,顏色,叫聲,名字等封裝成一個類,以方便外部調用。對狗狗的價格和顏色使用了只讀屬性,因為它買來的歷史價格和顏色是不可以更改的(染毛暫不考慮)。通過封裝的思想我們可以增加狗狗體重等其它公有屬性,而不會影響到外部接口的調用,對私有的只讀屬性做到了保護。
相信通過這兩個實例,已經完全對封裝熟悉了。假如我們的狗狗又生了一個寶寶,他的很多特征都基本相同,我們是不是又要復制一次這個類呢?這就要用到面向對象的另一個重要特性——繼承,下面會慢慢介紹。
歸納一下封裝的要點
要點:
1.封裝,就是把一個對象所能操作的所有信息放在一起
2.封裝能減少耦合,保持統一的對外接口,內部修改不影響外部調用