[.net 物件導向程式設計基礎] (11) 物件導向三大特性——封裝

yubinfeng發表於2015-06-05

[.net 物件導向程式設計基礎] (11) 物件導向三大特性——封裝

我們的課題是物件導向程式設計,前面主要介紹了物件導向的基礎知識,而從這裡開始才是物件導向的核心部分,即

物件導向的三大特性:封裝、繼承、多型。

1.封裝概念

封裝:每個物件都包含有它能進行操作的所有資訊,這個特性稱為封裝。這樣的方法包含在類中,通過類的例項來實現。

2.封裝的優點

A.良好的封裝能夠減少耦合(比如實現介面和邏輯分離)

B.可以讓類對外介面不變,內部可以實現自由的修改

C.類具有清晰的對外介面,使用者只需呼叫,無需關心內部

D.因為封裝的類功能相對獨立,因此能更好的實現程式碼複用

E.可保護程式碼不被無意中破壞,通過私有欄位等實現內部。注意:這裡的程式碼保護不是指程式碼本身的加密,而是對不想外部更改的程式碼通過私有實現。

為了更好的理解封裝的我們舉幾個實際例子

例項一:有一個漂亮的房子(House),房子裡有:床(Bed屬性)、沙發(Sofa屬性)、書桌(Desk屬性)、錢櫃(Box屬性),還有門(Door屬性)、窗子(Window屬性),我們可以用一個類及他的屬性成員來表示這個房子這個物件,在定義之前,我們可以考慮,像錢櫃、床這類個人隱私的東西,不能隨便讓路過的人看到,那就就是私有的。也不能把窗子也封閉起來不接受陽光,那麼窗子就是一個公有屬性。而門在離開家的時候需要鎖上,回到家需要開啟,這就是一個對外的方法,當然開鎖是需要有定的條件,比如有鑰匙等。通過以上的描述,我們來用程式碼實現這個封裝

 1 /// <summary>
 2 /// 房子類
 3 /// </summary>
 4 class House
 5 {
 6     object _bed;
 7     object _sofa;
 8     object _desk;
 9     object _box;
10     object _door;
11     object _window;
12 
13     /// <summary>
14     /// 床  預設私有成員
15     /// </summary>
16     object Bed
17     {
18         get { return _bed; }
19         set { _bed = value; }
20     }
21     /// <summary>
22     /// 沙發(私有)
23     /// </summary>
24     object Sofa
25     {
26         get { return _sofa; }
27         set { _sofa = value; }
28     }
29     /// <summary>
30     /// 書桌(私有)
31     /// </summary>
32     object Desk
33     {
34         get { return _desk; }
35         set { _desk = value; }
36     }
37     /// <summary>
38     /// 錢櫃(私有)
39     /// </summary>
40     object Box
41     {
42         get { return _box; }
43         set { _box = value; }
44     }
45 
46     /// <summary>
47     /// 門(公有)
48     /// </summary>
49     public object Door
50     {
51         get { return _door; }
52         set { _door = value; }
53     }
54 
55     /// <summary>
56     /// 窗子(公有)
57     /// </summary>
58     public object Window
59     {
60         get { return _window; }
61         set { _window = value; }
62     }
63 }

 

例項二:我們單位養了一隻價值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.封裝能減少耦合,保持統一的對外介面,內部修改不影響外部呼叫

 

 

==============================================================================================

返回目錄

 <如果對你有幫助,記得點一下推薦哦,有不明白的地方或寫的不對的地方,請多交流>

============================================================================================== 

相關文章