Data hiding (การซ่อนข้อมูล) เป็นคุณสมบัติสำคัญของ OOP ป้องกันไม่ให้ฟังก์ชันเข้าถึง internal representation ของคลาสโดยตรง การจำกัดการเข้าถึงสมาชิกคลาส ระบุด้วย access modifiers: public, private, protected ภายในร่างกายคลาส
ค่าเริ่มต้น (default) สำหรับสมาชิกและคลาสคือ private
ตัวอย่างโครงสร้างคลาส
class Base {
public:
// สมาชิก public: เข้าถึงได้จากทุกที่
protected:
// สมาชิก protected: เข้าถึงได้ในคลาสนี้และ derived class
private:
// สมาชิก private: เข้าถึงได้เฉพาะในคลาสนี้และ friend เท่านั้น
};
รายละเอียดแต่ละระดับ
Public (สาธารณะ)
- เข้าถึงได้จากที่ไหนก็ได้นอกคลาส แต่ภายในโปรแกรม
- สามารถ set/get ค่า public variables ได้โดยไม่ต้องผ่าน member function
- เป็น interface ของคลาส
Private (ส่วนตัว)
- เข้าถึงไม่ได้จากนอกคลาส แม้แต่ derived class
- เฉพาะคลาสเองและ
friendfunctions/classes เท่านั้นที่เข้าถึงได้ - ใช้สำหรับ implementation details ที่ต้องการซ่อน
Protected (ป้องกัน)
- คล้าย private แต่เพิ่มสิทธิ์: derived class (คลาสลูก) เข้าถึงได้
- ใช้สำหรับสมาชิกที่ derived class ต้องใช้แต่อยากซ่อนจากภายนอก
Inheritance Access Specifiers (การสืบทอดพร้อมระบุการเข้าถึง)
นอกจาก member access แล้ว C++ ยังมี inheritance access specifier ที่ควบคุมว่า base class members จะมองเห็นใน derived class อย่างไร:
| Base Member | Public Inheritance | Protected Inheritance | Private Inheritance |
|---|---|---|---|
| public | public | protected | private |
| protected | protected | protected | private |
| private | inaccessible | inaccessible | inaccessible |
- Public inheritance: IS-A relationship (Liskov substitution) - derived class เป็น base class
- Protected inheritance: นادرใช้ - base class กลายเป็น protected ใน derived
- Private inheritance: IS-IMPLEMENTED-IN-TERMS-OF - ใช้เพื่อ reuse implementation ไม่ใช่ interface
สรุป: ใช้ public inheritance สำหรับ IS-A ใช้ composition (has-a) แทน private inheritance ถ้าเป็นไปได้ protected ใช้เมื่อ derived class ต้องเข้าถึง base members