萬物起始,風景依舊,
不免俗的得先從最為基礎的開始說起,
不論什麼都得從最底層的說起,
首先我們先清楚定義,
關於解釋,
封裝(Encapsulation)
一種將抽象性函數介面的實作細節部份包裝、隱藏起來的方法。
同時,它也是一種防止外界呼叫端,去存取物件內部實作細節的手段。
以粗略一點的解釋,筆者會把他想成一個有功能的盒子,
外面看不到他有什麼,
但往往具備著某項功能,筆者只要知道給予他什麼,
他就能實現筆者的功能。
以一個例子,
筆者需要知道我移動了多遠,
那麼我只要呼叫MovingDistance的這個function,
這是一種封裝,
這是在函式方面的封裝,
是一種將資料(變數)和操作資料的方法(函式或方法)結合成一個單位的概念。
model.MovingDistance();
從名稱上就能猜測到大概意思,
並且去使用的。
那麼想當然的,不可能會把所有東西都弄在外面,
也很難一個個去嘗試,
確認哪一個不該隨意改,
哪一個能改,
那麼要如何能讓外界隨意呼叫,
並且知道各個的定義呢?
很簡單,
限制權限就行,
常見的如public、protected、private,
public從名稱上來看很容易就讓人明白,
是公開能讓任何人去使用的。
而protected是受保護的,
只有自己與子類別去使用,
是介於public與private中間所使用的,
但與現實中常見的介於中間的材質常被使用,
在這邊反而是處於一個較為尷尬的場景,
雖然有著必要,
往往比較少去使用,
最常見的是在繼承中去使用,
由於筆者學疏才淺,
沒想到一個好的案例,
至於詳細的用途還請各位多多嘗試,
但請不要認為不使用繼承的話,
效果與private一樣,
這是有所區別的。
剩下的private,
就是更為緊縮權限,
一旦使用這個就只能自己才能使用,
當然也有除這三個之外的,例如最常見的預設,
但這個往往會在不同的程式語言中會有不同的範圍,
等到各位真的用到再去專研就可以了。
九成以上都會是public、protected、Private,這三個解決,
並且如果能靈活運用,
就可以限制外部程式碼對內部資料和實作的訪問
舉個剛剛所想到的程式作為例子結尾,
這個汽車物件擁有以下屬性,這部分屬於私人(private):
車牌號碼(License Plate)
品牌(Brand)
顏色(Color)
引擎狀態(Engine Status)
private string licensePlate;
private string brand;
private string color;
private bool engineRunning;
汽車物件還可以執行以下操作(public function):
開啟引擎(Start Engine)
關閉引擎(Stop Engine)
讓任何人都可以來進行操控。
除此之外,
其實某些屬性並沒有真的要訂的很死,
再符合某些條件的狀況下,
希望能去改動屬性,
就像是顏色,想要改變,
但筆者限制了權限,變成私人屬性,
不能隨便改屬性的前提下,
想去更改私人屬性筆者要怎麼做呢?
順著上面的流程,可以得到幾個結論,
private只能自己操控,
而public function可以讓外部使用。
那麼其實答案就會是把這兩件事情組合起來,
筆者只要把屬性交給自己操控,
並提供一個公有方法,
就可以讓外部進行變更
那麼基於此,就能創建一個public function
更改車輛顏色(Change Color)。
以下為本次解說中所提到的完整程式。
public class CaeModel
{
private string licensePlate;
private string brand;
private string color;
private bool engineRunning;
public CaeModel(string licensePlate, string brand, string color)
{
this.licensePlate = licensePlate;
this.brand = brand;
this.color = color;
this.engineRunning = false;
}
public void StartEngine()
{
if (!engineRunning)
{
engineRunning = true;
Console.WriteLine("Engine started.");
}
}
public void StopEngine()
{
if (engineRunning)
{
engineRunning = false;
Console.WriteLine("Engine stopped.");
}
}
public void ChangeColor(string newColor)
{
color = newColor;
Console.WriteLine($"Car color changed to {newColor}.");
}
}
---筆者後言
因為在閱讀下總覺得"我"很奇怪,
所以我把"我"更改成筆者,
還請各位見諒。