上一篇有分享物件導向的物件(Object)、類別(Class)、欄位(Field)、屬性值(Property)、方法(Method)還有一個建構式函式(Construstor)的概念,接下來會跟大家分享的就是物件導向的特性,它有封裝、繼承、多型這三大特性,先來分享一下封裝是怎麼一回事。
一、封裝(Encapsulation)
封裝就是把一些功能的處理程序或是資料包起來,也對於程式碼做權限的設定做一層保護的機制,這是為了防止程式碼被竄改,所以有了封裝可以保障我們資料的隱密性,甚至封裝也是一種將一些處理程序隱藏起來,讓使用者使用時可以更加單純。
1.什麼意思?
如同我們電腦開機,以前DOS時代電腦開機可能就需要做很多指令或是動作才能開機,現在只要按電源鍵電腦就會自動幫你開機到桌面的畫面或是到帳戶登入密碼的畫面,中間過程中我們使用者就可以不用管內部處理是怎麼運行的,這部分也就稱為「封裝」。
那麼電腦使用時會有一個或多個使用者帳戶,這就是去控制電腦一些檔案對於使用者的權限,哪些檔案是可以存取、哪些檔案是唯讀的相關權限的設定,這部分也算是「封裝」在做的事。
2.在程式中通常在哪裡會看到它?
當你看到修飾詞Public、Private、Protected這些的時候,就是封裝的作用出來了。直接來看程式,每個動作結果都會使用label來顯示狀況。
此程式的意思就是:
(我們假裝先對於封裝按鈕視為電源鍵)
當我們按下電源鍵,它就會觸發啟動這個程式,它就會去找到Computer這個類別,去new一個物件出來命名為pc,接著往下執行相關程式去做pc.Act()這個動作,再往下就是屬於封裝的權限使用狀況。(權限使用狀況待會兒再說明)
我們再來看一下主程式要使用類別的程式內容
由於主程式一開始new完去建立好一個類別後,第一個要使用這個類別的就是pc.Act()這個動作,因此程式就會跳到Computer這個類別中,找到Act這個方法(黃框)去執行裡面的內容。
我們這邊就用pcAct這個訊息來代表執行開機狀態吧~執行完就會回主程式繼續執行下一行動作,那麼我們就先來看一下結果(先看第一行橘色框就好)
是不是就是我們在Computer類別中做Act這個動作的訊息對吧!
這個就是封裝,主程式只要做Act()那麼內部就會幫我們處理好該做的事,我們只要等待收結果就好了!
3.「權限問題」與「Get/Set使用差別」
這邊先說一下Get 和Set差別:
Get是取得內容值
(當主程式未給予值的時候,就會使用內部class類別給予的初始值)
Set是設定內容值
(當有賦予值的時候,就會去設定這個值,
倘若前面多了修飾詞,如:private set這樣的話,就代表主程式不可以修改,只能讀取)
我們直接來看程式,首先看一下主程式中,從顯示「電腦的動作」這邊開始說明:
主程式(顯示使用class的修飾詞與get/set差別)
Computer類別(顯示使用class的修飾詞與get/set差別)
由主程式為主來一行行說明:
第一行:顯示字串(說明用途而已,由程式執行結果的橘色框下一行看起)
第二行:增加顯示pc.Action 這個值
那麼pc.Action就是跑到類別中取得Action的值,看到類別的Action程式,它做的事情就是設定或更改內容值
因為主程式的第二行是直接進行pc.Action取值,所以程式只有執行get{return pcAction;} 直接取得類別給予的初始值,也就是「提供內容值」,故傳到主程式去就是「提供內容值」這樣的內容,可以對照上面程式執行的結果。
第三行:就是主程式要去設定Action的值為「開機」,因此使用pc.Action,程式就會進入到類別的Action中執行set{pcAction=value;}去設定。
執行前pcAction的值為「提供內容值」,value的值為「開機」。
執行後,value的值給予pcAction,因此pcAction的值就會更改為「開機」,value的值依然為「開機」。
第四行:增加顯示pc.Action 這個值
pc.Action一樣也會跑到類別中取得Action的值,也只有執行get{return pcAction;},此時的pcAction的值已經更新為「開機」,因此傳到主程式去的值就是「開機」,故程式執行解果所顯示的就會是「開機」。
主程式再往下看下一段顯示電腦名稱的部分,對照程式執行結果就要看最後一小段的部分
第一行:顯示字串(說明用途)
第二行:增加顯示pc.Name 這個值
一樣也是跑到類別中從get{...}取得初始值為「橙果杏」。
第三行:想要設定pc.Name的值 (會錯誤)
這邊為什麼會錯誤?是因為一樣也是要跑到類別中從set{...}設定值,但是!! set前面有加一個修飾詞private(私有的),這代表僅提供已讀模式不可被修改,也就是做保護資料內容值的意思。因此在主程式中想要給予值是不可行的,也就會出現錯誤。
第四行:因為值未修改,所以它就會跟第二行出現的值一樣呈現「橙果杏」(這邊程式執行結果並沒有執行這行,想要知道可以自行操作看看ㄛ)
主程式看到最後一行,也就是pc.password;
一樣也是使用類別中的password,但是這邊無論是方法還是內容值的設定,由於在類別中對於password它是屬於private(私有的),因此主程式不可使用也不可唯讀,也就是隱藏狀態,主程式根本不會知道有這個存在的意思。
所以經過這樣的分享有沒有懂一點什麼是封裝了呢?
這邊在跟大家統整一下,封裝就是功能性打包,有些內容值可以做隱藏、唯讀、修改的處理,保護資料的安全性(使用get / set再配合修飾詞的方法即可)。那麼主程式在使用的時候就會比較容易簡單,只要叫某某class去做ABC的事,那麼主程式只要等結果就好,內部處理就可以不管它。
這邊再提一個當要做修改內容值還可以使用「建構函式」使用方法如下:
首先我們先看ComputerFunction的類別,電腦的動作、電腦的名稱這兩段跟Computer的類別一樣都不動,多了一個建構函式(黃框部分),這邊就是讓主程式使用的時後必須放入的參數,也就是需要設定的內容值,從主程式傳進來此類別中。主程式想要取得值可以運用剛剛的方法再從此類別中取得。
再回來看主程式的部分,當觸發後(也就是button按鈕按下去)
第一行:除了new一個物件為pc2外,後面還會跟著小跟班各種參數。
這邊就是讓主程式要去設定參數的部分。接著建立完物件後,就會到pc2這類別中執行此類別的建構函式,然而裡面執行的動作就是將取得的setaction、setname內容值給予此類別內部的pcAction、pcName變數。
第二行、第四行:這邊取得的值也是會跑到pc2這個類別中執行get{...},那麼由於一開始我們已經設定參數的內容值,這邊也是會取得一樣的值。看執行結果就知道啦~