Polymorphism คือความสามารถที่คำสั่งเดียวกันทำงานต่างกันตามชนิดของ Object แบ่งได้เป็น Compile-time เช่น Overloading และ Run-time เช่น Override ผ่านการเรียกแบบ Dynamic Binding
Virtual Function ช่วยให้โปรแกรมเลือกเมธอดจริงตามชนิดของ Object ขณะรัน ช่วยให้โค้ดยืดหยุ่นและขยายได้ง่าย
Abstract Class เป็นแม่แบบของคลาสที่ยังไม่สมบูรณ์ ใช้กำหนดโครงสร้างร่วมและบังคับให้คลาสลูก implement เมธอดสำคัญ
Interface เป็นสัญญาการทำงานของคลาส ระบุว่าคลาสต้องมีเมธอดใดบ้างโดยไม่ผูกกับรายละเอียดการทำงานภายใน
ออกแบบระบบที่มีหลายชนิด Object เช่น Shape, Payment หรือ Notification โดยใช้ Abstract Class หรือ Interface
ผู้เรียนเห็นประโยชน์ของ Polymorphism ผ่านโจทย์ที่มี Object หลายชนิดแต่เรียกใช้งานผ่านคำสั่งเดียวกัน เช่น calculateArea(), pay() หรือ send() แนวคิดนี้ช่วยลด if-else ที่ตรวจชนิดข้อมูลจำนวนมาก และทำให้เพิ่มชนิดใหม่ได้โดยกระทบโค้ดเดิมน้อยลง
Abstract Class เหมาะเมื่อคลาสลูกมีโครงสร้างหรือโค้ดบางส่วนร่วมกัน ส่วน Interface เหมาะเมื่ออยากกำหนดความสามารถโดยไม่บังคับลำดับชั้นของคลาส ผู้เรียนต้องเลือกใช้ให้เหมาะกับโจทย์
สร้างระบบ Shape, Payment หรือ Notification ที่มีชนิดย่อยอย่างน้อย 3 ชนิด และเรียกใช้งานผ่าน reference ประเภทแม่หรือ interface
Polymorphism คือความสามารถที่คำสั่งเดียวกันทำงานต่างกันตามชนิด object จริง ช่วยลดการเขียน if-else เพื่อตรวจชนิดข้อมูลจำนวนมาก
%%{init: {'theme': 'base', 'themeVariables': {'background': '#282828','primaryColor': '#3c3836','primaryTextColor': '#fbf1c7','primaryBorderColor': '#fabd2f','lineColor': '#b8bb26','secondaryColor': '#504945','tertiaryColor': '#665c54'}}}%%
classDiagram
class Shape {
+area()
}
class Circle {
+area()
}
class Rectangle {
+area()
}
Shape <|-- Circle
Shape <|-- Rectangle
#include <iostream>
using namespace std;
class Shape {
public:
virtual double area() = 0; // abstract method
};
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) { radius = r; }
double area() override { return 3.14 * radius * radius; }
};
int main() {
Shape* shape = new Circle(10);
cout << shape->area() << endl; // expected: 314
delete shape;
return 0;
}
| แนวคิด | ความหมาย | ตัวอย่าง |
|---|---|---|
| Abstract Class | class แม่ที่ยังไม่สมบูรณ์ | Shape |
| Virtual Function | method ที่เลือกตาม object จริง | area() |
| Interface | สัญญาความสามารถ | Drawable, Payable |