物件導向程式設計(Object-Oriented Programming, OOP),是當今程式設計很重要的基礎之一,已被廣泛應用在各種軟體架構開發,是一種透過程式語言將腦中的想法物件化並加以實現的過程。
良好的物件導向設計擁有三個特性封裝(Encapsulation)、繼承(Inheritance)、多型(Polymorphism),將屬於物件的功能及資料封裝至類別(Class)內,並提供對外的接口,確保外部對物件使用;其次以物件為基礎(父類別)再衍生出新物件(子類別),讓新的物件除了有原本功能,還可以擴充新的功能,或進一步覆寫原有功能,使得物件在框架下有更多不同的呈現。
封裝(Encapsulation)
封裝的用意除了將物件所屬的方法、屬性放到類別內之外,更重要的功能透過存取修飾詞(Access Modifiers)來限制外部對其訪問及操作,讓物件功能單純並降低物件之間的耦合。
主要的修飾詞有public、protected、private,透過這三種修飾可以決定一個類別的方法、屬性的開放與否。
- public:此層級的方法、屬性…等,可以被任意存取。
- protected:此層級的方法、屬性…等,可讓相同類別或是衍生類別可以存取。
- private:此層級的方法、屬性…等,只有相同類別內可以存取。
註:C#存取修飾詞還有internal,但因為屬於組件(Assembly)之間的關係就不在此說明。
繼承(Inheritance)
物件的繼承可以是interface、class,在實務上繼承的可以是一種介面、抽象物件,也可以是現有類別的衍生。
class Vehicle {}
class Car : Vehicle {}
class Motorcycle : Vehicle {}
繼承的物件會擁有父類別的特性,並可以擴充或是覆寫(override)原生方法。相對的父類別也可以限制類別方法、成員,也就是用abstract、virtual來讓繼承類別可以覆寫。
- abstract:「抽象類別」不能產生實例;「抽象方法」則不會實作內容,會由繼承的類別實作。
- virtual:「虛擬方法」則需要實作內容,也可讓繼承的類別覆寫原有方法。
註:C# sealed可密封類別不讓別人繼承。
多型(Polymorphism)
物件的多型可分為兩種,覆寫(Overriding)及多載(Overloading)。
Overriding:為物件多型的重要過程,需要結合繼承的動作,繼承的物件可以透過覆寫(override)父類別原生的方法、屬性來達到多型的目的。
abstract class Vehicle
{
protected abstract int Wheel { get; }
protected virtual void StartEngine()
{
Console.Write("啟動交通工具");
}
}
class Car : Vehicle
{
protected override int Wheel { get; } = 4;
protected override void StartEngine()
{
Console.Write("發動汽車");
}
}
class Motorcycle : Vehicle
{
protected override int Wheel { get; } = 2;
protected override void StartEngine()
{
Console.Write("發動摩托車");
}
}
Overloading:方法的多載常見於方法的名稱相同但簽章(Signature)不同,也就是輸入的參數型別可以不同。
class A
{
public void Sum(int a, int b); //a+b
public void Sum(int a, int b, int c); //a+b+c
}
最後,物件導向的特性重點在封裝可降低物件耦合,父子類別繼承的關係,以及透過覆寫內容來達到多型的目的。良好的運用這些特性可以提高程式碼的重用性,減少重複的程式碼,並且易於維護及擴展。
以上是物件導向三大特性的說明。如果有描述錯誤的地方,歡迎交流。
發佈留言