首頁 » 物件導向 » 物件導向三大特性之封裝、繼承、多型

物件導向三大特性之封裝、繼承、多型

作者:

分類:

物件導向程式設計(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
}

最後,物件導向的特性重點在封裝可降低物件耦合,父子類別繼承的關係,以及透過覆寫內容來達到多型的目的。良好的運用這些特性可以提高程式碼的重用性,減少重複的程式碼,並且易於維護及擴展。

以上是物件導向三大特性的說明。如果有描述錯誤的地方,歡迎交流。

參考資料

「cian」的個人頭像

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *