Parent Class และ Child Class: ความสัมพันธ์แบบสืบทอด
ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับ Inheritance หรือการสืบทอดคุณสมบัติ ซึ่งเป็นหัวใจสำคัญของการเขียนโปรแกรมเชิงวัตถุ (OOP) ในบทนี้ เราจะเจาะลึกความสัมพันธ์ระหว่าง Parent Class (Class แม่) และ Child Class (Class ลูก) เพื่อให้เข้าใจถึงกลไกการสืบทอดอย่างละเอียด
ความหมายของ Parent Class และ Child Class
Parent Class (หรือ Superclass, Base Class) คือ Class ที่เป็นต้นแบบ หรือ Class แม่ ที่ Child Class จะสืบทอดคุณสมบัติและพฤติกรรมไปใช้งาน เป็นเหมือนแม่พิมพ์ที่กำหนดโครงสร้างพื้นฐาน
Child Class (หรือ Subclass, Derived Class) คือ Class ที่สืบทอดคุณสมบัติและพฤติกรรมจาก Parent Class เป็นเหมือนลูกที่รับมรดกจากแม่ และสามารถเพิ่มเติมหรือปรับเปลี่ยนคุณสมบัติเหล่านั้นได้
ลองนึกภาพว่า Parent Class คือ "สัตว์" และ Child Class คือ "สุนัข" สุนัขเป็นสัตว์ ดังนั้นจึงสืบทอดคุณสมบัติพื้นฐานของสัตว์ เช่น กิน นอน หายใจ แต่ก็มีคุณสมบัติเฉพาะของสุนัขเอง เช่น เห่า วิ่งไล่ลูกบอล
ตัวอย่างง่ายๆ ของ Parent Class และ Child Class
พิจารณา Code ตัวอย่างต่อไปนี้:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function makeSound() {
echo "Generic animal sound\n";
}
}
class Dog extends Animal {
public function makeSound() {
echo "Woof!\n";
}
}
$animal = new Animal("Generic Animal");
$animal->makeSound(); // Output: Generic animal sound
$dog = new Dog("Buddy");
$dog->makeSound(); // Output: Woof!
?>
ในตัวอย่างนี้:
Animalคือ Parent ClassDogคือ Child Class ที่สืบทอดมาจากAnimalโดยใช้ KeywordextendsDogสืบทอด Property$nameและ MethodmakeSound()จากAnimalDog*Override* MethodmakeSound()เพื่อให้มีพฤติกรรมเฉพาะของสุนัข (เห่า)
การเข้าถึง Properties และ Methods ของ Parent Class
Child Class สามารถเข้าถึง Properties และ Methods ของ Parent Class ได้ ขึ้นอยู่กับ Access Modifiers ที่กำหนดไว้ (public, protected, private) เราได้เรียนรู้เรื่อง Access Modifiers ในบทก่อนๆ แล้ว:
- Public: สามารถเข้าถึงได้จากทุกที่ (ภายใน Class เอง, Child Class, ภายนอก Class)
- Protected: สามารถเข้าถึงได้จากภายใน Class เอง และจาก Child Class เท่านั้น
- Private: สามารถเข้าถึงได้จากภายใน Class เองเท่านั้น
ตัวอย่าง:
<?php
class Animal {
public $publicProperty = "Public";
protected $protectedProperty = "Protected";
private $privateProperty = "Private";
public function getPrivateProperty() {
return $this->privateProperty; // สามารถเข้าถึงจากภายใน Animal ได้
}
}
class Dog extends Animal {
public function accessProperties() {
echo $this->publicProperty . "\n"; // เข้าถึงได้
echo $this->protectedProperty . "\n"; // เข้าถึงได้
// echo $this->privateProperty . "\n"; // Error: Cannot access private property
echo $this->getPrivateProperty() . "\n"; // เข้าถึงได้ผ่าน Method ของ Animal
}
}
$dog = new Dog();
$dog->accessProperties();
echo $dog->publicProperty . "\n"; // เข้าถึงได้
// echo $dog->protectedProperty . "\n"; // Error: Cannot access protected property
// echo $dog->privateProperty . "\n"; // Error: Cannot access private property
?>
จากตัวอย่าง: Child Class (Dog) สามารถเข้าถึง publicProperty และ protectedProperty ของ Parent Class (Animal) ได้ แต่ไม่สามารถเข้าถึง privateProperty ได้โดยตรง ต้องเข้าถึงผ่าน Method ที่กำหนดไว้ใน Parent Class (เช่น getPrivateProperty())
การ Override Methods
การ Override Method คือการที่ Child Class สร้าง Method ที่มีชื่อเหมือนกับ Method ใน Parent Class เพื่อเปลี่ยนพฤติกรรมของ Method นั้นให้เหมาะสมกับ Child Class เอง เราได้เห็นตัวอย่างการ Override ในตัวอย่างแรกที่ Dog Override makeSound()
เหตุผลที่ต้อง Override:
- การปรับเปลี่ยนพฤติกรรม: เพื่อให้ Child Class มีพฤติกรรมที่แตกต่างจาก Parent Class
- การเพิ่ม Functionality: เพื่อเพิ่มความสามารถใหม่ๆ ให้กับ Child Class โดยอิงจากพื้นฐานของ Parent Class
ตัวอย่างเพิ่มเติมของการ Override:
<?php
class Vehicle {
public function startEngine() {
echo "Starting generic engine\n";
}
}
class Car extends Vehicle {
public function startEngine() {
echo "Starting car engine\n";
}
}
class Motorcycle extends Vehicle {
public function startEngine() {
echo "Starting motorcycle engine\n";
}
}
$vehicle = new Vehicle();
$vehicle->startEngine(); // Output: Starting generic engine
$car = new Car();
$car->startEngine(); // Output: Starting car engine
$motorcycle = new Motorcycle();
$motorcycle->startEngine(); // Output: Starting motorcycle engine
?>
ในตัวอย่างนี้: Car และ Motorcycle ต่างก็เป็น Vehicle แต่มีวิธีการสตาร์ทเครื่องยนต์ที่แตกต่างกัน จึง Override Method startEngine() เพื่อให้เหมาะสมกับประเภทของยานพาหนะ
สรุป
Parent Class และ Child Class เป็นความสัมพันธ์ที่สำคัญใน Inheritance ซึ่งช่วยให้เราสามารถสร้าง Class ที่มีความเฉพาะเจาะจง โดยอิงจาก Class ที่เป็นพื้นฐาน ทำให้ Code มีโครงสร้างที่ดี ลดความซ้ำซ้อน และง่ายต่อการดูแลรักษา การเข้าใจ Access Modifiers และการ Override Methods เป็นสิ่งจำเป็นเพื่อให้สามารถใช้ Inheritance ได้อย่างมีประสิทธิภาพ ในบทถัดไป เราจะเรียนรู้เกี่ยวกับ Keyword parent ซึ่งเป็นเครื่องมือสำคัญในการเข้าถึง Methods ของ Parent Class จากภายใน Child Class