C# 物件導向程式設計(Object-oriented programming,OOP) (一) 介紹

  • 15417
  • 0
  • C#
  • 2016-01-21

物件導向程式設計(OOP)是一種程式設計的典範,也可以看成是一種程式設計的方法。所謂的"物件"指的就是具有屬性和方法的資料,物件的特徵用"屬性"來描述,物件的行為以"方法"來描述。

物件就是利用類別的設計所製作出來的成品,類別是用來對物件做分門別類,是一群具有相同性質物件的集合。類別是用來描述這些物件的屬性和方法,類別本身並不是實際的物件。類別只是一種抽象的資料型別,而物件則是屬於該種資料型別的實體變數。

物件導向的三大特性:
封裝:(Encapsulation):指的是將一組相關的屬性、方法和其他成員,視為單一單位或物件。
繼承(Inheritance):則是描述依據現有類別來建立新類別的能力。
多型(Polymorphism):指的是您可以有多個交替使用的類別,即使每個類別是以不同的方式來實作相同的屬性或方法。

封裝:(Encapsulation):
物件都會擁有物件內部的私有部分(屬性、方法...)而這些部分必須是外界無法直接存取,這樣才能保有物件的完整性。
如果"破壞封裝"的話,會有可能無法恢復原來的功能,因此物件必須將私有的部分封裝在物件的內部,而使用者只能藉由物件所提供的方法、屬性來操控物件,以保持物件的完整性,這就是封裝的特性。

封裝當中也有另一個概念就是所謂的"抽象化",也就是對於一個事物來說,我們只需要知道他怎麼操作就好,但是它的內部構造或實作方法是怎麼樣的我們不需要去理解,所以我們在實施封裝的特性時,就要讓別人不知道類別的內部成員是如何實作,只能透過該物件提供的公開類別成員來進行操作。

例如一台車子,我們只要能開就好,使用者不須要知道為什麼踩了油門之後,車子就會發動,只要知道怎麼開車就好。
 

class 車子
{
    private void 踩油門() {};
    
    public void 左轉(){踩油門()};
    public void 加速(){踩油門()};
}

class 使用者
{
    車子 瑪莎拉蒂 = new 車子();
    瑪莎拉蒂.左轉();
}

繼承(Inheritance):
一個物件A得到另一個物件B特性的過程稱為“A繼承B”,物件B則屬於“父類別”或稱基礎類別(Base class),物件A則屬於子類別或稱為衍生類別(Derived class)。

子類別可以繼承父類別的能力,直接使用父類別非私有的屬性和方法。
子類別只能繼承一個父類別。
父類別的方法若宣告為虛擬(virtual),則表示該方法可以被子類別覆寫(非必需)。
父類別的方法若宣告為抽象(abstract),則表示該子類別一定要覆寫該方法(子類別為抽象類別除外)。
類別若包含抽象成員,則該類別必需宣告為抽象類別。
父類別又叫做基底類別(Base Class)。
子類別又叫做衍生類別(Derived Class)。
若方法或屬性宣告為密封(sealed),則不可以被子類別覆寫

//定義 Employee員工類別

class Emplloyee
{
	屬性A
	方法A
}

//Manager經理類別繼承自Employee員工類別

class Manager:Employee
{
	屬性B
	方法B
}


多型(Polymorphism):又稱同名異式,是透過動態繫結的方式讓我們在程式執行時期可以動態決定物件參考所要執行的方法,多型允許我們在程式中使用名稱相同的方法或屬性,但不須考慮當時使用的物件型別是什麼。若要設計多型,子類別就必須先覆寫父類別同名稱的方法或屬性,接著再使用父類別的物件參考來選擇所要執行子類別物件實體的方法。由於多型的使用上會在類別中建立名稱相同的成員(屬性或方法),多載(Overloading)和覆寫(Overriding)也可以建立名稱相同的成員,因此有必要釐清這兩者的概念。

多載(Overloading):可接受不同個數的參數或不同資料型別的參數,用來提供不同版本的屬性或方法。也就是多個方法擁有"相同名稱"但"不同參數",傳入不同參數時會執行對應的方法。

class 類別
{
    public void 多載方法( ) { };
    public void 多載方法(int a ) { };
    public void 多載方法(int a, int b ) { };
    public void 多載方法(int a, int b, int c ) { };
}

覆寫(overriding):子類別的成員可用來取代父類別中不適用的成員,子類別覆寫父類別的成員時,子類別與父類別的成員必須接受相同個數的參數與相同的資料型別。也就是子類別重新定義父類別的"同名同參數"方法。

如果子類別想要重新定義父類別的方法或屬性(覆寫),首先必須將父類別的方法宣告為virtual,表示父類別允許被子類別的同名的方法覆蓋;而子類別要覆蓋父類別同名稱的方法,必須將子類別的方法宣告為override(覆寫),表示要重新定義父類別的方法。

class 父類別
{
    virtual void 覆寫方法( ) {  };
}

class 子類別 : 父類別
{
    public override void 覆寫方法( ){  };
}

 

有夢最美 築夢踏實

活在當下 認真過每一天

我是阿夢 也是Ace