2013年12月13日 星期五

小山的 C# 教學-第27課-所以到底甚麼是封裝性?

本課簡介

本課將搬出前三堂課只有略提卻沒有詳細解釋的「封裝性」
並為這段下個總結

教學影片

注意:影片有高畫質 720P 的選項,可以看得更清楚喔!



重點提示

1. 所謂的「封裝性」指的就是:「隱藏物件內部的實作細節,只留下讓外人操作的介面(方法)」

2. 封裝性的好處有二:
(1) 保護物件內部的變數
(2) 隱藏實作細節,讓別人使用只需知道使用方法即可

3. 有一種技術稱之為「緊密封裝」,意思就是「把物件內所有 Property 都設成 private,並只提供 public method 或 Get&Set 存取器來供外界操作變數」

補充

存取範圍修飾字

其實之前所教的 public 與 private 就是所謂的「存取範圍修飾字」,也就是只要加上其中一個關鍵字,就可以控制後面東西的存取範圍。而在 C# 裡面,這類的修飾字一共有五個:

public, protected, internal, protectedinternal, private。

第一個跟第五個想必大家都很清楚了,那麼其他三個又是甚麼呢?protected 與 protectedinternal 與下一段「繼承性」有關,這邊暫不作介紹。因此我們今天只討論 internal,它的定義是「存取只限於目前的組件 (assembly)」,好像有點難懂?我們來解釋一下。

不知道大家還記不記得,程式碼轉換成可以執行的檔案需要經過一個「編譯 (Compile)」的動作?而所謂的 internal,其實指的就是「在同一次編譯的所有程式碼之中,任何地方都可以存取」的意思。

假設你現在有兩個 Class, A 跟 B,然後 A 之中有個變數:
internal int number; 這個時候,如果你先把 Class A 編譯,並塞入一個程式庫(DLL 檔),然後讓 B 去使用這個程式庫。要是 Class B 這個時候想要使用 Class A 的 number 的話,就會發生錯誤!因為 A 跟 B 不是一起編譯的,這樣就不符合 internal 的要求。所以當你不會單獨把一些 class 先編譯成程式庫,或是程式規模很小的時候,internal 其實就跟 public 沒甚麼兩樣。

最後要注意,有沒有想過如果你沒有加任何存取範圍修飾字的話,那麼那些變數預設會是 public 還是 private 呢?這邊要告訴你,如果是物件的 Property 的話,預設的存取範圍就是 internal 喔!


相關資訊連結

MSDN - 存取範圍層級

http://msdn.microsoft.com/zh-tw/library/ba0a1yw2%28v=vs.90%29.aspx

MSDN - internal

http://msdn.microsoft.com/zh-tw/library/7c5ka91b%28v=vs.90%29.aspx

2 則留言:

  1. 小山您好 看了您的課程讓我受益良多
    而近日我從書籍上也著手學習寫程式 其中遇到皆語法不懂之處想請教

    KinectSensor.KinectSensors.StatusChanged += KinectSensors_StatusChanged;
    (物件觸發) += 設定函數

    想問此句+=的意思
    你的影片提到+=在數學上為原本自己再加上+=後面的數字
    但在這裡他並非提到數字故我不是很能了解
    想在此詢問您
    感謝

    回覆刪除
    回覆
    1. Hello

      我猜得沒錯的話
      這裡的 += 是 C# 中一種特殊的語法,委派 (delegate)
      這是一種用於控制發生事件時,通知函式來處理事件的寫法
      在物件導向部分結束前都不會講到這個

      建議可以先參考下方連結內的文章
      http://www.dotblogs.com.tw/yc421206/archive/2009/02/16/7206.aspx

      刪除