# LOSoMan的物件導向OOP講解(C#為主)
###### tags: `LOSo講解` `C#`
## 什麼是OOP
物件導向編程(Object-oriented programming),縮寫OOP。顧名思義這種編程方式就是將程式封裝成一種物件,在使用上就會提高軟體的重用性、靈活性和擴充性。而通常一個物件(object)指的就是一個類別(class)的實例,類別可以提供公開的欄位(field)、屬性(attribute)、方法(method),使其他的程式碼可以呼叫使用,而我們的專案程式就是由物件們產生關聯而成的。
在OOP導向的程式語言(如: C#、Java等),強調著封裝、繼承、多型,就如同一場遊戲裡的基本規則,是如此重要的存在。
## OOP特性
1. 封裝(Encapsulation): 所有物件都是類別的實體化,而這些類別裡往往包含著欄位、屬性、方法。然而,我們在使用類別時,無須明白類別內部的邏輯以及所有的方法,就能使用。所以在類別裡,我們使用了如: private、protected、public的型別來修飾方法。private的方法只在這個類別裡所使用;protected及public的方法則可在此類別的實體化時被使用。這就是所謂的封裝,將多餘的資訊藏起來,而外部能接收少部分類別的資訊(通常為public屬性、public方法)。
2. 繼承(Inheritance): 在繼承這件事上,我們將較為基本的類別稱為父類別(parent class,如: 衣服);而在較上層繼承父類別的稱之為子類別(sub class,如: 襯衫)。假設父類別"衣服"定義了尺寸,那麼繼承了的子類別"襯衫"除了保有對尺寸的定義以外,更添加了顏色的定義。
3. 多型(Polymorphism): 在此包含了多載(Overloading)以及覆寫(Overriding)的兩種形式。多載指的是在同一類別下,有著相同名稱的方法,卻有不同的引數及方法內的邏輯;而覆寫則是指子類別去覆寫(Overriding)了父類別的virtual或abstract方法。
## 封裝、繼承範例
假設我們來到了服裝店,他們有賣圓領衣及襯衫,而這些衣服各有紅、黃、藍、綠的顏色,且對於各身高區間有不同尺寸的衣服大小。那麼,我們可以將其共通點(尺寸、顏色)設為衣服類別裡的公開屬性。
``` csharp=1
public class 衣服
{
private int 身高 = 0;
private E尺寸 尺寸 = E尺寸.None;
private E顏色 顏色 = E顏色.None;
public E顏色 取得顏色 { get { return 顏色; } }
public E尺寸 取得尺寸 { get { return 尺寸; } }
public 衣服(int 身高, E顏色 顏色)
{
this.身高 = 身高;
this.顏色 = 顏色;
身高比對尺寸();
}
private void 身高比對尺寸()
{
if (身高 < 100 || 身高 >= 200)
{
尺寸 = E尺寸.None;
}
else if (身高 >= 100 && 身高 < 120)
{
尺寸 = E尺寸.S;
}
else if (身高 >= 120 && 身高 < 140)
{
尺寸 = E尺寸.M;
}
else if (身高 >= 140 && 身高 < 160)
{
尺寸 = E尺寸.L;
}
else if (身高 >= 160 && 身高 < 180)
{
尺寸 = E尺寸.XL;
}
else if (身高 >= 180 && 身高 < 200)
{
尺寸 = E尺寸.XXL;
}
}
}
```
由於圓領衣以及襯衫在花紋上有不同的樣式,所以針對圓領衣以及襯衫建立為衣服的子類別,並在建構式中增添不同列舉的花紋項目。還有就是使這兩個子類別繼承衣服父類別。
```csharp=1
public class 襯衫 : 衣服
{
private E襯衫花紋 花紋 = E襯衫花紋.None;
public E襯衫花紋 取得花紋 { get { return 花紋; } }
public 襯衫(int 身高, E顏色 顏色, E襯衫花紋 花紋)
: base(身高, 顏色)
{
this.花紋 = 花紋;
}
}
public class 圓領衣 : 衣服
{
private E圓領花紋 花紋 = E圓領花紋.None;
public E圓領花紋 取得花紋 { get { return 花紋; } }
public 圓領衣(int 身高, E顏色 顏色, E圓領花紋 花紋)
: base(身高, 顏色)
{
this.花紋 = 花紋;
}
}
```
最後,在"確認"按鈕裡對這兩個類別做實體宣告。這樣,我們就可以在"確認"按鈕下去觸發購買哪一件衣服的類別。
```csharp=
private void btn_確認購買_Click(object sender, EventArgs e)
{
if (cbx_衣服樣式.Text.Equals("襯衫"))
{
襯衫 新衣服 = new 襯衫(int.Parse(tbx_身高.Text), (E顏色)cbx_衣服顏色.SelectedItem, (E襯衫花紋)cbx_花紋.SelectedItem);
rtb_明細.AppendText(string.Format("襯衫{0}色{1}花紋,尺寸:{2} \n", 新衣服.取得顏色, 新衣服.取得花紋, 新衣服.取得尺寸));
}
else if (cbx_衣服樣式.Text.Equals("圓領衣"))
{
圓領衣 新衣服 = new 圓領衣(int.Parse(tbx_身高.Text), (E顏色)cbx_衣服顏色.SelectedItem, (E圓領花紋)cbx_花紋.SelectedItem);
rtb_明細.AppendText(string.Format("圓領衣{0}色{1}花紋,尺寸:{2} \n", 新衣服.取得顏色, 新衣服.取得花紋, 新衣服.取得尺寸));
}
初始介面();
}
```
### 運行結果
再輸入完資料並按下按鈕後,就會得到以下結果囉!

## 參考
1. [維基百科-物件導向程式設計](https://zh.wikipedia.org/wiki/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1)
2. [物件導向(Object Oriented Programming)概念 By Po-Ching Liu](https://totoroliu.medium.com/%E7%89%A9%E4%BB%B6%E5%B0%8E%E5%90%91-object-oriented-programming-%E6%A6%82%E5%BF%B5-5f205d437fd6)
3. [【OOP】三大特性:封裝、繼承、多型](https://rileylin91.github.io/2020/06/19/OOP-2-OOP-Feature/)