มีการเพิ่มคำตอบบางส่วนในหัวข้อที่น่าสนใจนี้แล้ว แต่ฉันไม่พบเหตุผลที่แท้จริงว่าทำไมพฤติกรรมนี้จึงเป็นแบบนี้ ให้ฉันลองดู:
ย้อนไปเมื่อวันวาน
อยู่ระหว่าง Smalltalk ใน 80 และ Java ในช่วงกลางยุค 90 แนวคิดของการวางแนววัตถุที่ครบกำหนด การซ่อนข้อมูลไม่ใช่แนวคิดดั้งเดิมที่มีให้เฉพาะกับ OO (กล่าวถึงครั้งแรกในปี 1978) ถูกนำมาใช้ใน Smalltalk เนื่องจากข้อมูลทั้งหมด (สาขา) ของชั้นเรียนมีความเป็นส่วนตัวทุกวิธีเป็นแบบสาธารณะ ในระหว่างการพัฒนาใหม่ของ OO ในยุค 90 เบอร์ทรานด์เมเยอร์พยายามทำให้แนวคิดของ OO เป็นรูปเป็นร่างขึ้นในหนังสือสำคัญของเขาObject Oriented Software Construction (OOSC)ซึ่งนับตั้งแต่นั้นมาก็ถือเป็นการอ้างอิงที่ชัดเจนเกี่ยวกับแนวคิดของ OO และการออกแบบภาษา .
ในกรณีของการมองเห็นส่วนตัว
ตามวิธีการของเมเยอร์ควรมีให้สำหรับชุดคลาสที่กำหนด (หน้า 192-193) สิ่งนี้ทำให้เห็นได้ชัดว่ามีการซ่อนตัวของข้อมูลที่ละเอียดสูงมากคุณลักษณะต่อไปนี้มีให้สำหรับ classA และ classB และการสืบทอดทั้งหมด:
feature {classA, classB}
methodName
ในกรณีที่private
เขากล่าวว่าต่อไปนี้: โดยไม่ต้องประกาศประเภทที่ชัดเจนในระดับของตัวเองคุณไม่สามารถเข้าถึงคุณลักษณะ (เมธอด / ฟิลด์) ในการโทรที่ผ่านการรับรอง คือถ้าx
เป็นตัวแปรx.doSomething()
ไม่ได้รับอนุญาต แน่นอนว่าการเข้าถึงที่ไม่ได้รับอนุญาตจะทำได้ภายในชั้นเรียนเอง
กล่าวอีกนัยหนึ่ง: เพื่ออนุญาตการเข้าถึงโดยอินสแตนซ์ของคลาสเดียวกันคุณต้องอนุญาตการเข้าถึงเมธอดของคลาสนั้นอย่างชัดเจน บางครั้งเรียกว่าอินสแตนซ์ส่วนตัวกับคลาสส่วนตัว
อินสแตนซ์ส่วนตัวในภาษาการเขียนโปรแกรม
ฉันรู้ว่ามีการใช้งานอย่างน้อยสองภาษาในปัจจุบันที่ใช้การซ่อนข้อมูลอินสแตนซ์ส่วนตัวเมื่อเทียบกับการซ่อนข้อมูลระดับส่วนตัว หนึ่งคือไอเฟลภาษาที่ออกแบบโดยเมเยอร์ซึ่งนำพา OO ไปสู่สุดขั้ว ภาษาอื่นที่เป็นทับทิมซึ่งเป็นภาษาที่ใช้กันทั่วไปในปัจจุบัน ในทับทิมprivate
หมายถึง: "ส่วนตัวกับอินสแตนซ์นี้" "ส่วนตัวถึงกรณีนี้"
ตัวเลือกสำหรับการออกแบบภาษา
มีคนแนะนำว่าการอนุญาตให้อินสแตนซ์ส่วนตัวนั้นยากสำหรับคอมไพเลอร์ ฉันไม่คิดอย่างนั้นเพราะมันค่อนข้างง่ายที่จะอนุญาตหรือไม่อนุญาตการโทรไปยังวิธีการที่เหมาะสม หากเป็นวิธีส่วนตัวdoSomething()
จะได้รับอนุญาตและx.doSomething()
ไม่ได้เป็นผู้ออกแบบภาษาได้กำหนดความสามารถในการเข้าถึงอินสแตนซ์อย่างเดียวอย่างมีประสิทธิภาพสำหรับวิธีการและฟิลด์ส่วนตัว
จากมุมมองทางเทคนิคไม่มีเหตุผลที่จะเลือกทางเดียวหรืออื่น ๆ (โดยเฉพาะเมื่อพิจารณาว่า Eiffel.NET สามารถทำสิ่งนี้กับ IL ได้แม้จะมีหลายมรดก แต่ก็ไม่มีเหตุผลที่จะให้คุณลักษณะนี้)
แน่นอนว่ามันเป็นเรื่องของรสนิยมและตามที่คนอื่นพูดถึงแล้ววิธีการบางอย่างอาจจะยากกว่าในการเขียนโดยไม่ต้องมีการมองเห็นในระดับชั้นของวิธีการและฟิลด์ส่วนตัว
เหตุใด C # อนุญาตให้มีการห่อหุ้มคลาสเท่านั้นและไม่ใช่การห่อหุ้มอินสแตนซ์
หากคุณดูที่เธรดอินเทอร์เน็ตในการห่อหุ้มอินสแตนซ์ (บางครั้งคำที่ใช้เพื่ออ้างถึงความจริงที่ว่าภาษากำหนดตัวดัดแปลงการเข้าถึงในระดับอินสแตนซ์เมื่อเทียบกับระดับคลาส) แนวคิดมักจะขมวดคิ้ว อย่างไรก็ตามการพิจารณาว่าภาษาสมัยใหม่บางภาษาใช้อินสแตนซ์การห่อหุ้มอย่างน้อยสำหรับตัวดัดแปลงการเข้าถึงส่วนตัวทำให้คุณคิดว่ามันสามารถใช้งานได้และเป็นสิ่งที่ใช้ในโลกแห่งการเขียนโปรแกรมสมัยใหม่
อย่างไรก็ตาม C # ดูเป็นเรื่องยากที่สุดในการออกแบบภาษา C ++ และ Java ในขณะที่ Eiffel และ Modula-3 อยู่ในรูปภาพด้วยเมื่อพิจารณาถึงคุณสมบัติหลายอย่างของ Eiffel ที่หายไป (การสืบทอดหลายแบบ) ฉันเชื่อว่าพวกเขาเลือกเส้นทางเดียวกับ Java และ C ++ เมื่อมาถึงตัวปรับการเข้าถึงส่วนตัว
หากคุณต้องการทราบว่าทำไมคุณควรลองจับ Eric Lippert, Krzysztof Cwalina, Anders Hejlsberg หรือใครก็ตามที่ทำงานบนมาตรฐานของ C # แต่น่าเสียดายที่ผมไม่สามารถหาบันทึกที่ชัดเจนในข้อเขียนC # Programming Language