[62010948] “Inherited Class การสืบทอดคลาส”

Sirawit Sukwattanavit
3 min readNov 1, 2019

--

“ อย่าพึ่งตกใจไปไอสอง !… มันไม่ได้ยากขนาดนั้น ”

“ อยากมีปืนหลายกระบอกจัง… ทำยังไงดี? ”

“ อยากมีรถหลายคัน… เขียนโปรแกรมยังไงดี? ”

“ อยากมีตัวละครหลายตัวให้เลือก… ทำยังไงดี? ”

บทความนี้จะสอนเกี่ยวกับ “การสืบทอดของคลาส”

มีประโยชน์มากๆสำหรับ การเขียนโปรแกรมขนาดใหญ่ ที่มีแม่แบบที่คล้ายคลึงกัน

เช่น …

ชนิดปืน มี… ปืนพก ปืนกล ปืนกลหนัก ปืนแม่นไกล

ชนิดยานพาหนะ (หรือ รถ) มี… รถเก๋ง รถตู้ รถบรรทุก

ชนิดตัวละคร มี… พระเอก1 พระเอก2 นางเอก1 นางเอก2

ซึ่งแต่ละ Class แม่ ก็จะมีสิ่งที่เหมือนๆกันของเหล่าคลาสลูก อย่างเช่น

คลาสแม่ ปืน มี จำนวนกระสุน/ อัตราการยิง/ รูปร่าง/ รูปทรง/ สี

คลาสแม่ ยานพาหนะ (หรือ รถ) มี ความเร็ว/ จำนวนคนนั่ง/ รูปร่าง/ รูปทรง/ สี

คลาสแม่ ตัวละคร มี เลือด / อาวุธ /รูปร่าง/ รูปทรง/ สี

เป็นต้น

อาจจะไม่ได้ทำเป็นรูปแบบของ SFML แต่เชื่อได้ว่าจะมีประโยชน์ต่อการเขียนโปรแกรมแน่นอน :)

เอาที่ง่ายที่สุด จะได้เข้าใจหลักการทำงาน

ผมจะยกตัวอย่างของ Class Vehicle (ยานพาหนะ)

จะสังเกตได้เลยว่า ทั้ง 3 Class นี้ มี Method ที่เหมือนกันเด้ะๆ เรียกได้ว่าก้อปวาง

กันเลยทีเดียว ซึ่งถามว่า เขียนแบบนี้ได้มั้ย …

แน่นอนครับ มันได้ …แต่ !

ถ้าเรารู้วิธีการเขียน Inherited Class หรือการสืบทอดของคลาส

เชื่อได้เลยว่า ความคิดแบบนี้จะเปลี่ยนไป…

เพราะการเขียนโดย ไม่ใช้ Inherited Class จะ…

  1. ทำให้โค้ดของเรายาวขึ้น โดยไม่มีความจำเป็นใดๆเลย (เหมือนภาพด้านบนอะ)
  2. ทำให้ Debug โค้ดตัวเองยากขึ้น แก้ไขลำบาก
  3. ทำให้ฟุ่มเฟือยพื้นที่การใช้งานการคำนวณของคอมพิวเตอร์

ลองมาดูกันดีกว่า ว่าเจ้านี่มันมีดีอะไรขนาดนั้น …

อ้าาา! เริ่มเห็นแล้วใช่มั้ย ว่ามันมีประโยชน์ยังไง

มันสามารถรวบสิ่งที่เหมือนกันเช่น method ของ Class Vehicle ที่ทุก ยานพาหนะจะมี

ได้แก่…

  1. FuelAmount();
  2. Capacity();
  3. applyBreaks();

แต่ ยานพาหนะทุกคัน จะมีค่าภายในที่ต่างกันอยู่ ทั้งรูปร่าง รูปทรง ค่า stat ต่างๆ

ซึ่ง การใช้ Inherited Class จะทำให้โค้ดสั้นลงมาก และ Debug ง่ายมากๆเลย…

“ แต่มันเขียนยากอะ … เขียนปกติเถอะนะ ”

ก็เพราะมันไม่ยากขนาดนั้น ถึงเลยมาเขียนบทความอยู่นี่ไง 555

Syntax Inherited Class ไม่ยากอย่างที่คิด

class subclass_name : access_mode base_class_name
{

//body of subclass
};

subclass_name = ชื่อคลาสลูก

access_mode = โหมดสำหรับการสืบทอด

base_class_name = ชื่อคลาสแม่

body of subclass = เนื้อข้อมูลที่เขียนในคลาสลูก

อาจจะยังไม่เห็นภาพ ลองมาดูตัวอย่างกันเลย

// Inherited Class Example
#include <iostream>
using namespace std;


//Base class
class Parent
{
public:
int id_p;
};


// Sub class inheriting from Base Class(Parent)
class Child : public Parent
{
public:
int id_c;
};


//main function
int main()
{

Child obj1;


// An object of class child has all data members
// and member functions of class parent
obj1.id_c = 7;
obj1.id_p = 91;
cout << "Child id is " << obj1.id_c << endl;
cout << "Parent id is " << obj1.id_p << endl;

return 0;
}

Output:

Child id is 7
Parent id is 91

จากโค้ดด้านบนเราจะเห็นได้ว่า เราประกาศการสืบทอดเป็น : public Parent

ทำให้เราสามารถดึงทุกอย่างที่อยู่ใน Parent มาใช้ได้หมดเลย (ยกเว้น private ของ Parent)

โหมดของการสืบทอด Mode of Inheritance

class Child : public Parent

มี 3 อย่างหลักๆ คือ

  1. public
  2. protected
  3. private

มาดูตัวอย่างการใช้งานเลยดีกว่า

//Example of Mode of Inheritance
class A
{
public:
int x;
protected:
int y;
private:
int z;
};


class B : public A
{

// x is public
// y is protected
// z is not accessible from B
};

class C : protected A
{

// x is protected
// y is protected
// z is not accessible from C
};

class D : private A
// 'private' is default for classes
{
// x is private
// y is private
// z is not accessible from D
};

โดยคอนเซปของการ Inherited Class จะเห็นได้ว่า มันไม่ยากเลย แถมยังสามารถช่วยในการเขียนโปรแกรมได้ดีขึ้นเยอะมากๆ สำหรับโปรเจคเกมที่มีขนาดสเกลที่ใหญ่

ชนิดของการ Inheritence

มีหลายชนิด ผมจะยกตัวอย่างมาหนึ่งชนิดที่ใช้บ่อยเลยก็คือ

การสืบทอดคลาสแบบเดี่ยว หรือ Single Inherited Class

ใช้บ่อยสำหรับการทำ ชนิดของรถ หรือปืน ที่มี method เหมือนกัน ต่างกันที่ property ของแต่ละชนิด

// Single inheritance 
#include <iostream>
using namespace std;

// base class
class Vehicle {
public:
Vehicle()
{
cout << "This is a Vehicle" << endl;
}
};


// sub class derived from two base classes
class Car: public Vehicle{

};


// main function
int main()
{

// creating object of sub class will
// invoke the constructor of base classes
Car obj;
return 0;
}

Output :

This is a vehicle

หวังว่าเพื่อนๆ จะได้รับประโยชน์ ไม่มากก็น้อยสำหรับการสืบทอดคลาส

และยังมีอีกหลายชนิดของ Inheritance Class ที่ผมยังไม่ได้บอกอีกมากมาย

สามารถกดเข้าไปศึกษาเพิ่มเติมในลิ้งนี้ได้เลยย

ขอบคุณที่อ่านจนจบนะครับ :)

นาย สิรวิชญ์ สุขวัฒนาวิทย์ 62010948

--

--