Khá nhiều câu trả lời đã được thêm vào chủ đề thú vị này, tuy nhiên, tôi hoàn toàn không tìm thấy lý do thực sự tại sao hành vi này lại diễn ra như vậy. Hãy để tôi thử
Quay trở lại những ngày
Ở đâu đó giữa Smalltalk trong thập niên 80 và Java vào giữa những năm 90, khái niệm về hướng đối tượng đã trưởng thành. Việc che giấu thông tin, ban đầu không được coi là một khái niệm chỉ có sẵn cho OO (được đề cập đầu tiên vào năm 1978), được giới thiệu trong Smalltalk vì tất cả dữ liệu (các trường) của một lớp là riêng tư, tất cả các phương thức đều công khai. Trong nhiều phát triển mới của OO trong những năm 90, Bertrand Meyer đã cố gắng chính thức hóa phần lớn các khái niệm OO trong cuốn sách mang tính bước ngoặt Xây dựng phần mềm hướng đối tượng (OOSC) mà sau đó được coi là một tài liệu tham khảo chính xác về các khái niệm OO và thiết kế ngôn ngữ .
Trong trường hợp tầm nhìn riêng tư
Theo Meyer, một phương thức nên được cung cấp cho một nhóm các lớp xác định (trang 192-193). Điều này rõ ràng mang lại độ chi tiết ẩn rất cao, tính năng sau đây có sẵn cho classA và classB và tất cả con cháu của họ:
feature {classA, classB}
methodName
Trong trường hợp private
anh ta nói như sau: không khai báo rõ ràng một loại là hiển thị với lớp của chính nó, bạn không thể truy cập tính năng đó (phương thức / trường) trong một cuộc gọi đủ điều kiện. Tức x
là nếu là một biến,x.doSomething()
không được phép. Tất nhiên, quyền truy cập không đủ điều kiện được cho phép, bên trong lớp.
Nói cách khác: để cho phép truy cập theo một thể hiện của cùng một lớp, bạn phải cho phép phương thức truy cập theo lớp đó một cách rõ ràng. Điều này đôi khi được gọi là cá thể-riêng so với lớp-riêng.
Instance-private trong ngôn ngữ lập trình
Tôi biết ít nhất hai ngôn ngữ hiện đang sử dụng sử dụng ẩn thông tin cá nhân trái ngược với ẩn thông tin riêng tư lớp. Một là Eiffel, một ngôn ngữ được thiết kế bởi Meyer, đưa OO đến những thái cực nhất. Cái còn lại là Ruby, một ngôn ngữ phổ biến hơn nhiều hiện nay. Trong Ruby, private
có nghĩa là: "riêng tư trong trường hợp này" .
Lựa chọn thiết kế ngôn ngữ
Nó đã được đề xuất rằng cho phép cá nhân-private sẽ khó cho trình biên dịch. Tôi không nghĩ vậy, vì nó tương đối đơn giản khi chỉ cho phép hoặc không cho phép các cuộc gọi đủ điều kiện đến các phương thức. Nếu cho một phương thức riêng tư, doSomething()
được cho phép vàx.doSomething()
không, thì một nhà thiết kế ngôn ngữ đã xác định hiệu quả khả năng truy cập chỉ đối tượng cho các phương thức và trường riêng.
Từ quan điểm kỹ thuật, không có lý do để chọn cách này hay cách khác (đặc biệt khi xem xét rằng Eiffel.NET có thể làm điều này với IL, ngay cả với nhiều kế thừa, không có lý do cố hữu nào để không cung cấp tính năng này).
Tất nhiên, đó là vấn đề của hương vị và như những người khác đã đề cập, khá nhiều phương pháp có thể khó viết hơn nếu không có tính năng hiển thị cấp độ của các phương thức và trường riêng.
Tại sao C # chỉ cho phép đóng gói lớp và không đóng gói cá thể
Nếu bạn xem các chủ đề internet về đóng gói cá thể (một thuật ngữ đôi khi được sử dụng để chỉ thực tế là một ngôn ngữ xác định các công cụ sửa đổi truy cập ở cấp độ cá thể, trái ngược với cấp độ lớp học), khái niệm này thường được sử dụng. Tuy nhiên, xem xét rằng một số ngôn ngữ hiện đại sử dụng đóng gói cá thể, ít nhất là cho công cụ sửa đổi truy cập riêng tư, khiến bạn nghĩ rằng nó có thể và được sử dụng trong thế giới lập trình hiện đại.
Tuy nhiên, C # đã thừa nhận là khó nhất đối với C ++ và Java về thiết kế ngôn ngữ. Trong khi Eiffel và Modula-3 cũng có mặt trong bức tranh, xem xét nhiều tính năng của Eiffel bị thiếu (nhiều kế thừa), tôi tin rằng họ đã chọn cùng một tuyến đường với Java và C ++ khi nói đến công cụ sửa đổi truy cập riêng.
Nếu bạn thực sự muốn biết lý do tại sao bạn nên cố gắng nắm giữ Eric Lippert, Krzysztof Cwalina, Anders Hejlsberg hoặc bất kỳ ai khác làm việc theo tiêu chuẩn của C #. Thật không may, tôi không thể tìm thấy một ghi chú dứt khoát trong Ngôn ngữ lập trình C # được chú thích .