iT邦幫忙

2023 iThome 鐵人賽

DAY 2
0
自我挑戰組

初階面試常見題目彙整系列 第 2

初階面試常見題目回答-封裝-鐵人賽第二日

  • 分享至 

  • xImage
  •  

萬物起始,風景依舊,
不免俗的得先從最為基礎的開始說起,

不論什麼都得從最底層的說起,
首先我們先清楚定義,
關於解釋,

封裝(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}.");
    }

}

---筆者後言
因為在閱讀下總覺得"我"很奇怪,
所以我把"我"更改成筆者,
還請各位見諒。


上一篇
初階面試常見題目回答-前言-鐵人賽第一日
下一篇
初階面試常見題目回答-繼承-鐵人賽第三日
系列文
初階面試常見題目彙整30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言