สัปดาห์ที่ 7 Encapsulation และ Inheritance

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

  1. ใช้ Encapsulation และ Access Modifier เพื่อซ่อนข้อมูลได้
  2. ออกแบบ Inheritance แบบ Single และ Multilevel ได้
  3. ใช้ Method Override เพื่อปรับพฤติกรรมของคลาสลูกได้

เนื้อหา

Encapsulation

Encapsulation คือการรวมข้อมูลและเมธอดไว้ใน Class เดียวกัน พร้อมจำกัดการเข้าถึงข้อมูลภายในด้วย Access Modifier เช่น private, protected และ public เพื่อป้องกันการใช้งานผิดวิธี

Inheritance

Inheritance ช่วยให้คลาสลูกสืบทอดคุณสมบัติจากคลาสแม่ ลดโค้ดซ้ำ และสร้างโครงสร้างที่สะท้อนความสัมพันธ์ของวัตถุได้

Override

Override คือการเขียนเมธอดในคลาสลูกเพื่อปรับพฤติกรรมจากคลาสแม่ให้เหมาะกับบริบทเฉพาะ

Workshop

สร้างลำดับชั้นของ Class จากโจทย์ เช่น บุคคล-นักศึกษา-อาจารย์ หรือสินค้า-สินค้าดิจิทัล-สินค้ากายภาพ

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

ผู้เรียนฝึกตัดสินใจว่าข้อมูลใดควรเป็น private, protected หรือ public โดยยึดหลักว่าภายนอกควรเข้าถึงผ่านพฤติกรรมที่ควบคุมได้ ไม่ควรแก้ข้อมูลภายในโดยตรงหากมีเงื่อนไขทางธุรกิจเกี่ยวข้อง

การใช้ Inheritance ต้องพิจารณาความสัมพันธ์แบบ "เป็นชนิดหนึ่งของ" เช่น Student เป็น Person ไม่ใช่แค่ "มีข้อมูลคล้ายกัน" หากใช้ผิดจะทำให้โครงสร้างซับซ้อนและแก้ไขยาก

แนวปฏิบัติ

  1. ใช้ private เป็นค่าเริ่มต้นสำหรับข้อมูลภายใน
  2. ใช้ protected เฉพาะเมื่อคลาสลูกจำเป็นต้องเข้าถึง
  3. หลีกเลี่ยง inheritance ที่ลึกเกินไป
  4. Override เฉพาะพฤติกรรมที่ต่างจริง

แบบฝึกหัด

สร้างคลาสแม่ 1 คลาสและคลาสลูกอย่างน้อย 2 คลาส พร้อมเมธอดที่ถูก override และตัวอย่างการเรียกใช้งาน

รูปแบบการนำเสนอเพิ่มเติมตามแม่แบบ

Encapsulation คือการซ่อนข้อมูลภายใน class และเปิดให้เข้าถึงผ่าน method ที่ควบคุมได้ ส่วน Inheritance คือการสร้าง class ใหม่จาก class เดิมเพื่อลดโค้ดซ้ำและแสดงความสัมพันธ์แบบ "เป็นชนิดหนึ่งของ"

%%{init: {'theme': 'base', 'themeVariables': {'background': '#282828','primaryColor': '#3c3836','primaryTextColor': '#fbf1c7','primaryBorderColor': '#fabd2f','lineColor': '#8ec07c','secondaryColor': '#504945','tertiaryColor': '#665c54'}}}%%
classDiagram
  class Person {
    -string name
    +setName()
    +getName()
  }
  class Student {
    -string studentId
    +showRole()
  }
  class Teacher {
    -string employeeId
    +showRole()
  }
  Person <|-- Student
  Person <|-- Teacher

สมการประเมินการนำกลับมาใช้ซ้ำ

R=ct×100%

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

#include <iostream>
using namespace std;

class Person {
protected:
    string name;
public:
    void setName(string value) { name = value; }
};

class Student : public Person {
public:
    void showRole() {
        cout << name << " is a student" << endl;
    }
};

int main() {
    Student s;
    s.setName("Anan");
    s.showRole(); // expected: Anan is a student
    return 0;
}
แนวคิด จุดประสงค์ ข้อควรระวัง
private ซ่อนข้อมูล ภายนอกเข้าถึงไม่ได้โดยตรง
protected ให้ class ลูกใช้ อย่าเปิดกว้างเกินจำเป็น
override ปรับพฤติกรรม class ลูก ต้องรักษาความหมายเดิม

กลับรายวิชา