square-rightAbstract Classes

ธัญญา บุญเรือง 640710525

Abstract classes ในภาษา PHP คือคลาสที่มี Abstract Methods อย่างน้อยหนึ่งตัว ซึ่งคลาสที่เป็น abstract จะไม่สามารถสร้างอินสแตนซ์ได้ และคลาสลูกที่สืบทอดจากคลาสแม่ที่เป็น Abstract class จะต้องเรียกซ้ำ Abstract Methods ของคลาสแม่ ซึ่งจะเขียนโค้ดในคลาสลูกเพื่อเติมเต็มการทำงานนั้น

Abstract Methods คือเมธอดที่ถูกประกาศเอาไว้ในคลาสแม่ แต่ไม่ได้มีการเขียนโค้ดเพื่อทำงานในคลาสนั้น โดยจะต้องเรียกใช้ซ้ำในคลาสลูกที่สืบทอดอีกที

ซึ่ง Abstract Classes และ Abstract Methods จะถูกกำหนดด้วยคีย์เวิร์ด abstract

ตัวอย่าง Syntax :

<?php
abstract class ParentClass {
  abstract public function someMethod1();
  abstract public function someMethod2($name, $color);
  abstract public function someMethod3() : string;
}
?>

เมื่อมีการสืบทอดจาก Abstract Class จะต้องกำหนดเมธอดของคลาสลูกให้เป็นชื่อเดียวกันกับคลาสแม่และต้องประกาศซ้ำ Abstract Methods ของคลาสแม่ ต้องใช้ Access Modifier ที่มีข้อจำกัดเท่ากันหรือน้อยกว่า เช่น ถ้ากำหนด Abstract Methods เป็นแบบ protected เมธอดในคลาสลูกต้องเป็น protected หรือ public แต่ไม่สามารถเป็น private ได้ นอกจากนี้ ชนิดและจำนวนอาร์กิวเมนต์ต้องเหมือนกัน โดยที่คลาสลูกสามารถเพิ่มอาร์กิวเมนต์ได้

ตัวอย่าง:

<?php
// Parent class
abstract class Car {
  public $name;
  public function __construct($name) {
    $this->name = $name;
  }
  abstract public function intro() : string;
}

// Child classes
class Audi extends Car {
  public function intro() : string {
    return "Choose German quality! I'm an $this->name!";
  }
}

class Volvo extends Car {
  public function intro() : string {
    return "Proud to be Swedish! I'm a $this->name!";
  }
}

class Citroen extends Car {
  public function intro() : string {
    return "French extravagance! I'm a $this->name!";
  }
}

// Create objects from the child classes
$audi = new audi("Audi");
echo $audi->intro();
echo "<br>";

$volvo = new volvo("Volvo");
echo $volvo->intro();
echo "<br>";

$citroen = new citroen("Citroen");
echo $citroen->intro();
?>

จากตัวอย่าง คลาส Audi, Volvo และ Citroen ถูกสืบทอดมาจากคลาส Car ดังนั้นคลาส Audi, Volvo, และ Citroen จะสามารถใช้สมบัติ $name ที่เป็นแบบ public และเมธอด __construct() ที่เป็นแบบ public จากคลาส Car ได้ โดยที่เมธอด intro() เป็น Abstract Methods จะต้องประกาศซ้ำในคลาสลูกทุกคลาส และต้องคืนค่าเป็นสตริง

ผลลัพธ์จากตัวอย่าง:

ตัวอย่าง abstract method ที่มี argument:

จากตัวอย่าง มี Abstract Methods ชื่อ prefixName() โดยมีพารามิเตอร์ $name ซึ่งAbstract Methodsจะไม่ระบุการทำงานแต่จะให้คลาสที่สืบทอดเป็นผู้กำหนดวิธีการทำงาน และมี ConcreteClass ที่สืบทอดจาก AbstractClass ซึ่งคลาสนี้จะมีการประกาศเมธอด prefixName() ของคลาสแม่ โดยเพิ่มพารามิเตอร์ $separator ที่มีค่าเริ่มต้นเป็น "."

ผลลัพธ์จากตัวอย่าง:

เปรียบเทียบ Abstract Classes ของภาษา PHP, Java, C# และ Python

ตัวอย่าง:

ผลลัพธ์จากตัวอย่าง:

ภาษา PHP:

  • ใช้คีย์เวิร์ด abstract กำหนด Abstract Classes

  • Abstract Classes ไม่สามารถสร้างอินสแตนซ์ได้

  • Abstract Classes สามารถมีทั้งเมธอดปกติและAbstract Methods

  • Abstract Classes จะถูกสืบทอดโดยคลาสลูกซึ่งต้องกำหนดAbstract Methodsของคลาสแม่ทั้งหมด

  • สามารถมีProperties แบบ public, private หรือ protected ได้

ภาษา Java:

  • ใช้คีย์เวิร์ด abstract กำหนด Abstract Classes

  • Abstract Classes ไม่สามารถสร้างอินสแตนซ์ได้

  • Abstract Classes สามารถมีทั้งเมธอดปกติและAbstract Methods

  • Abstract Classes จะถูกสืบทอดโดยคลาสลูกซึ่งต้องกำหนดAbstract Methodsของคลาสแม่ทั้งหมด

  • สามารถมีคอนสตรัคเตอร์และเมธอดแบบ static ได้

  • สามารถมีเมธอดแบบ final ซึ่งจะบังคับไม่ให้คลาสย่อยเปลี่ยนแปลงเนื้อหาของเมธอดได้

ภาษา C#:

  • ใช้คีย์เวิร์ด abstract กำหนด Abstract Classes

  • Abstract Classes ไม่สามารถสร้างอินสแตนซ์ได้

  • Abstract Classes สามารถมีทั้งเมธอดปกติและAbstract Methods

  • Abstract Classes จะถูกสืบทอดโดยคลาสลูกซึ่งต้องกำหนดAbstract Methodsของคลาสแม่ทั้งหมด

  • ไม่สามารถใช้ static และ virtual ในการประกาศ Abstract Methods ได้

ภาษา Python:

  • Python ไม่มีAbstract Classesในตัวเอง

  • ใช้งานโดยการนำเข้าโมดูล abc ซึ่งเป็นพื้นฐานสำหรับการกำหนดAbstract Base classes (ABC)

  • ABC ทำงานโดยการตกแต่ง (decorating) เมธอดของคลาส Base ให้เป็นAbstract และทำการลงทะเบียนคลาสที่เป็นรูปธรรม (concrete classes) เพื่อเป็นการนำAbstract Base classesมาใช้งาน

  • ใช้ decorator @abstractmethod ในการกำหนดAbstract Methods

  • ถ้าไม่กำหนดคำนิยามกับเมธอด เมธอดนั้นก็จะกลายเป็นAbstract Methodsโดยอัตโนมัติ

Reference

W3Schools. (n.d.). PHP OOP: Abstract classes: [PHP - What are Abstract Classes and Methods?]. W3Schools.https://www.w3schools.com/php/php_oop_classes_abstract.asparrow-up-right

PHP Documentation Group. (n.d.). Class abstraction: [Example #2 Abstract class example]. PHP.net.https://www.php.net/manual/en/language.oop5.abstract.php#language.oop5.abstractarrow-up-right

Javatpoint. (n.d.). PHP OOPs abstract class: [Example 2]. Javatpoint. https://www.javatpoint.com/php-oops-abstract-classarrow-up-right

Tutorialspoint. (n.d.). PHP abstract classes: [Difference between Interface and Abstract Class in PHP: Abstract class]. Tutorialspoint. https://www.tutorialspoint.com/php/php_abstract_classes.htmarrow-up-right

W3Schools. (n.d.). Java abstract classes: [Example]. W3Schools. https://www.w3schools.com/java/java_abstract.asparrow-up-right

Javatpoint. (n.d.). Abstract class in Java: [Points to Remember]. Javatpoint. https://www.javatpoint.com/abstract-class-in-javaarrow-up-right

W3Schools. (n.d.). C# abstract classes: [Example]. W3Schools. https://www.w3schools.com/cs/cs_abstract.phparrow-up-right

Javatpoint. (n.d.). C# abstract: [Abstract Method], [C# Abstract class]. Javatpoint. https://www.javatpoint.com/c-sharp-abstractarrow-up-right

Javatpoint. (n.d.). Abstraction in Python: [Abstraction classes in Python], [Abstract Base Classes], [Working of the Abstract Classes], [Example -]. Javatpoint. https://www.javatpoint.com/abstraction-in-pythonarrow-up-right

Clip

Slides

Last updated