แก้ไข: การอ่านคำถามต่อไปอีกหน่อยฉันชอบความคิดของผู้ประกอบการ << >> มากไปและเพิ่มเป็นเพื่อนของชั้นเรียนเหล่านั้น แต่ฉันไม่แน่ใจว่าสิ่งนี้จะไม่ทำลาย encapsulation หรือไม่
มันจะทำลาย encapsulation ได้อย่างไร?
คุณทำลาย encapsulation เมื่อคุณอนุญาตการเข้าถึงสมาชิกข้อมูลที่ไม่ จำกัด พิจารณาคลาสต่อไปนี้:
class c1 {
public:
int x;
};
class c2 {
public:
int foo();
private:
int x;
};
class c3 {
friend int foo();
private:
int x;
};
c1
จะเห็นได้ชัดไม่ได้ห่อหุ้ม ทุกคนสามารถอ่านและแก้ไขx
ได้ เราไม่มีวิธีบังคับใช้การควบคุมการเข้าถึงใด ๆ
c2
ถูกห่อหุ้มอย่างชัดเจน x
ไม่มีการเข้าถึงของประชาชนที่จะเป็น ทั้งหมดที่คุณสามารถทำได้คือการเรียกfoo
ฟังก์ชั่นที่มีประสิทธิภาพดำเนินการบางอย่างที่มีความหมายในชั้นเรียน
c3
? มันห่อหุ้มน้อยกว่าไหม? อนุญาตให้เข้าถึงแบบไม่ จำกัด ได้x
หรือไม่ มันอนุญาตให้เข้าถึงฟังก์ชั่นที่ไม่รู้จักหรือไม่?
ไม่อนุญาตให้ฟังก์ชั่นหนึ่งเดียวเข้าถึงสมาชิกส่วนตัวของชั้นเรียนได้อย่างแม่นยำ เช่นเดียวกับที่c2
ทำ และเช่นเดียวc2
กับฟังก์ชั่นหนึ่งที่มีการเข้าถึงไม่ใช่ "ฟังก์ชั่นแบบสุ่มไม่ทราบบางอย่าง" แต่ "ฟังก์ชั่นที่ระบุไว้ในคำจำกัดความของคลาส" เช่นเดียวกับที่c2
เราเห็นโดยดูจากคำจำกัดความของชั้นเรียนซึ่งเป็นรายการที่สมบูรณ์ของผู้ที่สามารถเข้าถึงได้
ดังนั้นสิ่งที่ห่อหุ้มน้อยกว่านี้อย่างไร? รหัสในจำนวนเดียวกันมีการเข้าถึงสมาชิกส่วนตัวของชั้นเรียน และทุกคนที่มีสิทธิ์เข้าถึงจะแสดงรายการอยู่ในคำจำกัดความของชั้นเรียน
friend
ไม่ทำลาย encapsulation ทำให้โปรแกรมเมอร์ Java บางคนรู้สึกอึดอัดเพราะเมื่อพวกเขาพูดว่า "OOP" พวกเขาหมายถึง "Java" เมื่อพวกเขาพูดว่า "Encapsulation" พวกเขาไม่ได้หมายความว่า "สมาชิกส่วนตัวต้องได้รับการปกป้องจากการเข้าถึงโดยพลการ" แต่ "คลาส Java ที่ฟังก์ชันเดียวที่สามารถเข้าถึงสมาชิกส่วนตัวเป็นสมาชิกคลาส" ถึงแม้ว่าเรื่องนี้จะไร้สาระสมบูรณ์สำหรับ ด้วยเหตุผลหลายประการ
ก่อนอื่นดังที่แสดงไว้แล้วมัน จำกัด เกินไป ไม่มีเหตุผลใดที่วิธีการเพื่อนไม่ควรได้รับอนุญาตให้ทำเช่นเดียวกัน
ประการที่สองมันเป็นไปไม่เข้มงวดพอ พิจารณาชั้นสี่:
class c4 {
public:
int getx();
void setx(int x);
private:
int x;
};
สิ่งนี้ตามความคิดของ Java ที่กล่าวมาแล้วนั้นถูกห่อหุ้มอย่างสมบูรณ์แบบ
และยังอนุญาตให้ทุกคนอ่านและแก้ไข xได้ มันทำให้รู้สึกยังไง? (คำใบ้: มันไม่ได้)
Bottom line: Encapsulation นั้นเกี่ยวกับความสามารถในการควบคุมว่าฟังก์ชันใดที่สามารถเข้าถึงสมาชิกส่วนตัว มันไม่เกี่ยวกับที่นิยามของฟังก์ชันเหล่านี้อย่างแม่นยำ