物件導向OOP(Object-oriented programming)
以前都把技術筆記寫在自己的筆記本,想說既然都要寫部落格,把基本的技術觀念也記錄在部落格,增加記憶力XD
物件導向是甚麼:
類別(Class)算是一個藍圖、屬靜態的,他沒有實體(Instance)的概念。
物件(Object)是一個看的到、摸的到的實體,屬於動態的,狀態會隨時改變,但架構與行為不會改變。
比喻:
類別就像是設計房子的設計藍圖,而物件是實際蓋好的房子。
兩者的關係是設計藍圖(類別)決定了房子怎麼蓋,有幾台電梯,幾間房間,幾條走道。
而實際蓋好的房子(物件)是照著設計藍圖所蓋出來的房子,人只能照設計藍圖的設計使用這間房子,並不會多出一個手扶梯,因為藍圖沒有。
物件導向三大特性:
一.封裝
類別的內部成員可以封裝起來,讓別人不知道其如何實作,只能透過它提供的公開類別成員來進行操作。
例如開車你只需要知道如何啟動汽車,而不需要知道啟動汽車內部如何運作的。
class 使用者
{
static void Main(string[] args)
{
汽車 tv = new 汽車();
tv.啟動();
}
}
public class 汽車
{
public void 啟動()
{
開啟引擎();
}
private void 開啟引擎() { }
}
二.繼承
子類別可以繼承父類別的能力,直接使用父類別非私有的屬性和方法
父類別又叫做基底類別(Base Class),子類別又叫做衍生類別(Derived Class)。
將 Car 做為「父類別」,只保留汽車共同的屬性與方法,另外建立 Honda 與 Toyota 的「子類別」並繼承 Car 「父類別」,當今天需要使用到 Honda 與 Toyota 這二個廠牌的汽車物件時,只要直接 new 出 Honda 與 Toyota ,就可以擁有汽車的屬性與方法。
public class Car
{
public string Color { get; set; }
public int Speed { get; set; }
public void 啟動()
}
public class Honda : Car
{
}
public class Nissan : Car
{
}
三.多型
父類別可以定義和實作 virtual「方法」 ,而子類別可以決定要不要覆寫這些方法,換句話說,子類別可以提供自己的定義和實作。 當使用者在呼叫同一個方法時,可以有不同行為稱之為多型。
父類別的方法若宣告為虛擬(virtual),則表示該方法可以被子類別覆寫(非必需)
父類別的方法若宣告為抽象(abstract),則表示該子類別一定要覆寫該方法(子類別為抽象類別除外)
class 使用者
{
static void Main(string[] args)
{
父類別 tv = new 子類別();
tv.方法1();
Console.ReadLine();
}
}
public class 子類別 : 父類別
{
//可覆寫或不覆寫父類別虛擬方法
public override void 方法1() { Console.WriteLine("子類別方法1"); }
//一定要覆寫覆類別的抽象方法
public override void 方法2() { }
}
public abstract class 父類別
{
//子類別會繼承該屬性
public string 屬性1 { get; set; }
//子類別自己決定要不要覆寫
public virtual void 方法1() { Console.WriteLine("父類別方法1"); }
//子類別必須覆寫
public abstract void 方法2();
}
物件導向優點:可重用性和可維護性高。