類別(Class)
如果說物件導向(Object-oriented programming, OOP)定義了系統設計的概念,那麼將這個概念呈現的方式就是Class,Class最普遍的描述方式就是類比成現實中的藍圖,當你有了Class就可以實現出Class所描述的物件。
Class由架構、函式、變數組成,架構定義了Class的骨架,函式與變數則補充了Class的血肉,讓Class成為完整的物件模板。
Class一般會包含建構式、解構式(部分程式語言有回收機制,所以並沒有設計解構式)、公開類、隱私類、保護類等等組成,不同的語言也會加上某些特殊設計,但基本上都具有這幾大類。
Class在實例化(Instance)前都不會運作,直到實例化後,就會成為一個物件,物件擁有執行與操作電腦記憶體的能力。
Class的架構
class ClassName : InheritanceClass, Interface{
public:
Constructor(){};
~Destructor(){};
PublicFunction(){};
type PublicVariable;
private:
PrivateFunction(){};
type PrivateVariable;
protected:
ProtectedFunction(){};
type ProtectedVariable;
}
類別(Class)與抽象類別(Abstract Class)
Abstract Class是Class的概念化,如果說Class是完整的藍圖,那麼Abstract就是去掉所有藍圖細節後留下的外框。
#include <iostream>
using namespace std;
/* 抽象類別 */
class Number{
public:
Number(){};
~Number(){};
virtual int getone()=0; //抽象函式
};
/* 抽象具體化 */
class InheritFromNumber : Number{
public:
InheritFromNumber (){};
~InheritFromNumber (){};
int getOne(){return 1;} //定義具體行為
};
int main(){
cout << Number().getOne() << endl; //發生錯誤
cout << InheritFromNumber().getOne() << endl; //正確顯示
}
在Abstract Class中,若是沒有定義具體行為給Abstract Class的成員,則無法實例化,編譯後就會出現錯誤。
Abstract Class用抽象來命名,一般的用途是為了抽出類似的Class群體中的相同元素,形成實例的基礎模板,方便拓增與管理。
例如,貓、狗、馬、豬可以是4種不同的Class,我們可以在這之中抽取出動物的元素,作為Abstract Class,而這四種動物都會吃東西、睡覺、跑、跳,那麼我們可以認為動物行為中,也都會有吃東西、睡覺、跑、跳的概念,因此我們可以把這些概念寫入Abstract Class的成員裡面。
#include <iostream>
using namespace std;
/* 抽象類別 */
class Animal{
public:
Animal(){};
~Animal(){};
virtual void eat()=0; //抽象函式
virtual void sleep()=0; //抽象函式
virtual void run()=0; //抽象函式
virtual void jump()=0; //抽象函式
};
/* 抽象具體化 */
class Cat{
public:
Cat(){};
~Cat(){};
void eat(){ cout << "小貓 吃飯" << endl; };
void sleep(){ cout << "小貓 睡覺" << endl; };
void run(){ cout << "小貓 亂跑" << endl; };
void jump(){ cout << "小貓 亂跳" << endl; };
};
class Dog{
public:
Dog(){};
~Dog(){};
void eat(){ cout << "小狗 吃飯" << endl; };
void sleep(){ cout << "小狗 睡覺" << endl; };
void run(){ cout << "小狗 亂跑" << endl; };
void jump(){ cout << "小狗 亂跳" << endl; };
};
class Horse{
public:
Horse(){};
~Horse(){};
void eat(){ cout << "小馬 吃飯" << endl; };
void sleep(){ cout << "小馬 睡覺" << endl; };
void run(){ cout << "小馬 亂跑" << endl; };
void jump(){ cout << "小馬 亂跳" << endl; };
};
class Pig{
public:
Pig(){};
~Pig(){};
void eat(){ cout << "小豬 吃飯" << endl; };
void sleep(){ cout << "小豬 睡覺" << endl; };
void run(){ cout << "小豬 亂跑" << endl; };
void jump(){ cout << "小豬 亂跳" << endl; };
};
所以如果我們想要新增新的動物,像是獅子、老虎等等,那麼不需要另外去定義獅子會有甚麼基本行為,老虎會有甚麼基本行為,直接從Animal Class繼承下來,另外進行實作就可以了。
類別(Class)與介面(Interface)
Interface同樣也是由Class衍伸出來的模式之一,在使用以及特性上與Abstract Class相似,同樣不能直接實例化成為物件,需要變成Class的成員定義具體行為後才能成為物件的一部份被執行。同樣也是從不同的Class之間找出相同的元素並抽出成為一個通用的模板,但是在最後的用途上與Abstract Class並不相同。
Interface在設計上是被用來做為統一規格的介面接口使用,可以把他想成是牆壁上隨處可見的電力插座,不管是兩孔的或者三孔的,都是統一的規格。只要按照插座的規格去設計,就能夠順利地將電力送出。
#include <iostream>
using namespace std;
/* 介面 */
class powerOutlet{
public:
virtual bool powerOutputSuccess()=0; //抽象介面函式
};
/* 介面實例化 */
class bedroom : public powerOutlet{
public:
bedroom(){};
~bedroom(){};
bool powerOutputSuccess(){ return true; } //實例化介面函式
};
class bathroom : powerOutlet{
public:
bathroom (){};
~bathroom (){};
bool powerOutputSuccess(){ return true; } //實例化介面函式
};
class garden: powerOutlet{
public:
garden(){};
~garden(){};
bool powerOutputSuccess(){ return true; } //實例化介面函式
};
int main(){
//電力測試
cout<<bedroom().powerOutputSuccess()<<endl; //臥室電力正常
cout<<bathroom().powerOutputSuccess()<<endl; //浴室電力正常
cout<<garden().powerOutputSuccess()<<endl; //花園電力正常
}
就像上面這段程式碼,需要檢查電力的時候,只需要呼叫powerOutputSuccess()就能知道電力是否正常的數據。