สัปดาห์ที่ 8 Polymorphism, Abstract และ Interface

จุดประสงค์การเรียนรู้

  1. อธิบาย Compile-time และ Run-time Polymorphism ได้
  2. ใช้ Virtual Function และ Dynamic Binding ได้
  3. ออกแบบ Abstract Class และ Interface ได้

เนื้อหา

Polymorphism

Polymorphism คือความสามารถที่คำสั่งเดียวกันทำงานต่างกันตามชนิดของ Object แบ่งได้เป็น Compile-time เช่น Overloading และ Run-time เช่น Override ผ่านการเรียกแบบ Dynamic Binding

Virtual Function

Virtual Function ช่วยให้โปรแกรมเลือกเมธอดจริงตามชนิดของ Object ขณะรัน ช่วยให้โค้ดยืดหยุ่นและขยายได้ง่าย

Abstract Class

Abstract Class เป็นแม่แบบของคลาสที่ยังไม่สมบูรณ์ ใช้กำหนดโครงสร้างร่วมและบังคับให้คลาสลูก implement เมธอดสำคัญ

Interface

Interface เป็นสัญญาการทำงานของคลาส ระบุว่าคลาสต้องมีเมธอดใดบ้างโดยไม่ผูกกับรายละเอียดการทำงานภายใน

Workshop

ออกแบบระบบที่มีหลายชนิด Object เช่น Shape, Payment หรือ Notification โดยใช้ Abstract Class หรือ Interface

รายละเอียดการเรียนรู้

ผู้เรียนเห็นประโยชน์ของ Polymorphism ผ่านโจทย์ที่มี Object หลายชนิดแต่เรียกใช้งานผ่านคำสั่งเดียวกัน เช่น calculateArea(), pay() หรือ send() แนวคิดนี้ช่วยลด if-else ที่ตรวจชนิดข้อมูลจำนวนมาก และทำให้เพิ่มชนิดใหม่ได้โดยกระทบโค้ดเดิมน้อยลง

Abstract Class เหมาะเมื่อคลาสลูกมีโครงสร้างหรือโค้ดบางส่วนร่วมกัน ส่วน Interface เหมาะเมื่ออยากกำหนดความสามารถโดยไม่บังคับลำดับชั้นของคลาส ผู้เรียนต้องเลือกใช้ให้เหมาะกับโจทย์

แนวปฏิบัติ

  1. ใช้ Polymorphism เพื่อลด conditional ที่ขึ้นกับชนิด Object
  2. ใช้ Abstract Class เมื่อมี state หรือ logic ร่วม
  3. ใช้ Interface เมื่อต้องการกำหนดความสามารถร่วม
  4. ตั้งชื่อเมธอดในสัญญาให้ชัดเจนและคงที่

แบบฝึกหัด

สร้างระบบ 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

สมการพื้นที่วงกลมสำหรับตัวอย่าง Polymorphism

A=π×r2

ตัวอย่างโค้ดทดลอง

#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

กลับรายวิชา