arrows-down-to-peopleInheritance

ทินภัทร อันอาจงาม 640710518

Inheritance คือ คุณสมบัติการสืบทอดในการเขียนโปรแกรมเชิงวัตถุ (Object-Oriented Programming / OOP) โดย คลาสรอง/คลาสลูก (Child Class) จะสามารถสืบทอดคุณสมบัติ (Property), ตัวแปร (Variable) และ เมธอด (Method) มาจากคลาสหลัก/คลาสแม่ (Parent Class) ได้

  • รองรับการจำแนกเป็นลำดับขั้นตอน

  • การสืบทอดมี 3 แบบคือ สืบทอดครั้งเดียว, สืบทอดหลายครั้ง และสืบทอดหลายระดับ ซึ่งภาษา PHP จะรองรับแค่การสืบทอดครั้งเดียว ซึ่งจะมีแค่คลาสเดียวที่สามารถสืบทอดจากคลาสแม่หนึ่งตัว

circle-info

เราจะเรียกความสัมพันธ์ของคลาสแม่-ลูกว่า Parent-Child Relationship

เราสามารถดูระดับการเข้าถึงของคลาสรองได้ดังตารางด้านล่าง

ระดับการเข้าถึง
การสืบทอดจาก คลาสหลัก ไปยัง คลาสรอง

public

✔️

protected

✔️

private

constructor

Constructor ใน Inheritance

ในการสร้าง Constructor เพื่อเก็บข้อมูลใน object ที่เราสร้างจากคลาสหลัก มีคีย์เวิร์ดสำคัญคือ "__construct()"

<?php
    class Parentclass{
        public function __construct(){
            echo "This is parent constructor\n";
        }
    }
    $obj = new Parentclass();
?>

การสร้างคลาสลูกที่สืบทอดคุณสมบัติจากคลาสแม่ สามารถใช้คีย์เวิร์ด "extends" ได้

คุณสมบัติที่อยู่ใน Constructor ของคลาสหลักนั้น จะไม่สามารถเรียกใช้ได้โดยตรงผ่านคลาสลูก จะต้องใช้คีย์เวิร์ดคือ "parent::__construct()" ใน Constructor ของคลาสลูก

จากตัวอย่างโค้ดด้านบน จะแสดงให้เห็นถึงการสืบทอด parentclass โดยคลาสลูกชื่อ childclass จะใช้คำสั่ง extends เพื่อสืบทอดคลาส parentclass

Output ที่ได้จะมีทั้งของคลาส parentclass และ childclass แต่หาก childclass ไม่ได้มีการเพิ่มคำสั่งอะไรไป จะแสดงคำสั่งของคลาสแม่ได้ตามปกติ

ต่อไปจะเป็นตัวอย่างการสืบทอด โดยมีคลาส Vehicle เก็บข้อมูลแบรนด์และราคาของยานพาหนะนั้นๆ

Inheritance และระดับการเข้าถึงแบบ Protected

คุณสมบัติแบบ protected จะสามารถเรียกใช้ภายในคลาสตัวมันเองและคลาสที่สืบทอดไป จะไม่สามารถถูกเรียกจากข้างนอกได้

ตัวอย่างการเรียกใช้ protected method จากภายนอกด้วย object ของคลาส Car

จากตัวอย่างข้างต้นจะเห็นได้ว่า เราไม่สามารถเรียกใช้เมธอด print() ซึ่งถูกประกาศแบบ protected ภายในคลาส Vehicle ได้ ซึ่งเราสามารถเรียกใช้ protect method ได้โดยอีกวิธีนึงตามตัวอย่างถัดไปได้

โดยเราจะเรียกใช้เมธอด print() ภายในเมธอด type() ของคลาส Car ซึ่งสืบทอดมาจากคลาส Vehicle ด้วยวิธีนี้เราจะสามารถแสดงผลลัพธ์ที่เราต้องการได้อย่างถูกต้อง

จากโค้ดที่เปรียบเทียบ จะเห็นได้ชัดว่า ในภาษา C และ python จะไม่สามารถสร้างเมธอดหรือคลาสแบบมีระดับการเข้าถึงได้

การใช้งานเมธอด __toString()

โดยปกติแล้ว เมื่อมีการอ้างอิงถึงตัวแปร object โปรแกรมจะเรียกใช้เมธอดที่ชื่อ __toString() ซึ่งใช้สำหรับอธิบายเกี่ยวกับ object และส่งค่าเป็น String กลับมา ในภาษาอื่นๆเมธอดนี้จะถูกสร้างขึ้นโดยอัตโนมัติ แต่ในภาษา PHP เราจะต้องสร้างเมธอด __toString() ขึ้นมาเพื่อ Override และแสดงเกี่ยวกับ object นั้นๆ

จะเห็นได้ว่า เราสามารถแสดงข้อมูลของ object Vehicle ด้วยการพิมพ์คำสั่ง echo และตัวแปรออกมาได้เลย ผลลัพธ์ที่ได้จะตรงตามที่เรา Override ในเมธอด __toString()

การ Overriding เมธอด

เมธอดที่ถูกสืบทอดมาจากคลาสแม่สามารถถูกแทนด้วยเมธอดของคลาสลูกด้วยการสร้างเมธอดชื่อเดียวกัน

เราจะยกตัวอย่างการ Overriding ด้วยเมธอด print() ในคลาส Vehicle ที่จะแสดงข้อมูลแบรนด์และราคาของยานพาหนะที่เก็บไว้

การใช้คีย์เวิร์ด final เพื่อป้องกันการสืบทอดคลาส

เมื่อมีการใช้คีย์เวิร์ด final หน้าการประกาศคลาส คลาสอื่นๆจะไม่สามารถประกาศตัวเองเพื่อสืบทอดคลาสหลักได้

เมื่อเทียบ PHP กับภาษา Java,Python และ C

  • Inheritance : PHP และ Java จะใช้คีย์เวิร์ด extends เหมือนกันเพื่อสืบทอดคลาสหลัก, Python จะใช้คีย์เวิร์ด class และคำสั่ง () เพื่อระบุคลาสที่จะสืบทอด ส่วนภาษา C จะไม่มีคำสั่งสำหรับสร้างคลาสในตัว จะต้องใช้ struct ซ้อนกันเพื่อสืบทอด

  • Constructor : PHP จะเรียกใช้ constructor ของคลาสหลักโดยอัตโนมัติหากคลาสลูกไม่มี ใน Java และ Python จะมีการใช้คำสั่ง super()

  • protect method : ในภาษา Python และ C จะไม่มีการกำหนดระดับการเข้าถึง ซึ่งต่างจาก PHP และ Java

  • toString function : PHP จะใช้ฟังก์ชั่น __toString(), ใน Java จะใช้ toString(), Python จะใช้ __str__(), ใน C จะไม่มีฟังก์ชั่นนี้ในตัวเพราะไม่ได้ออกแบบมาให้รองรับการเขียนโปรแกรมเชิงวัตถุ

  • Overriding method : ทุกภาษาจะสามารถทำการ override เมธอดได้เหมือนกันหมด แต่ใน Java จะต้องมีคำสั่ง @Override เพื่อบอกว่าเมธอดนี้เป็นการ override เมธอด

  • final keyword : PHP และ Java จะใช้คำว่า final เพื่อไม่ให้เมธอดหรือคลาสนั้นถูก override ได้

สรุปคือ ทั้งภาษา Php,Java,Python จะมีความแตกต่างกันในเรื่องของคีย์เวิร์ดในการใช้คำสั่ง แต่ C เป็นภาษาที่ไม่ได้ถูกออกแบบมาเพื่อการเขียนโปรแกรมเชิงวัตถุ ทำให้มีความซับซ้อนในการเขียนโปรแกรมมากขึ้นกว่าการเขียนในภาษาอื่นๆที่รองรับ

Presentation Slide

Presentation Video

References

Last updated