【電腦科學】什麼是類別(Class)?

類別(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()就能知道電力是否正常的數據。

發佈留言

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