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

Sirawit Sukwattanavit
Nov 1 · 3 min read

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


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

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

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


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

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

เช่น …

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

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

ชนิดตัวละคร มี… พระเอก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

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade