2011-07-01 30 views
5

Các loại lồng nhau trong C# có khả năng truy cập các thuộc tính riêng của cha mẹ. Có lý do cụ thể nào để có tính năng ngôn ngữ này không? Theo ý kiến ​​của tôi, điều này phá vỡ đóng gói. Nếu tôi làm cho kiểu lồng nhau được công khai, thì tôi sẽ có thể phơi bày các thuộc tính riêng của lớp cha thông qua nó.Truy cập vào các thuộc tính riêng của cha mẹ thông qua các loại lồng nhau trong C#

+3

Có vô số khả năng thiết kế xấu; không có gì buộc bạn phải sử dụng chúng mặc dù. –

Trả lời

6

Bạn sẽ có thể - nhưng bạn chỉ có thể lồng lớp nếu bạn đã có nó trong cùng một tệp nguồn như lớp bên ngoài ở địa điểm đầu tiên.

Hiệu quả lớp lồng nhau được "sở hữu" bởi lớp bên ngoài và được tin cậy ở mức độ tương tự như bất kỳ thành viên nào khác của lớp bên ngoài. Một phương thức trong lớp ngoài có thể phơi bày một thuộc tính riêng - nhưng bạn không tin nó, bởi vì bạn sở hữu tất cả mã đó. Tương tự như vậy bạn (tác giả của lớp bên ngoài) sở hữu tất cả mã của một lớp lồng nhau. Nếu bạn không muốn phá vỡ đóng gói trong lớp lồng nhau, chỉ cần tránh viết mã có thể phá vỡ đóng gói :)

+5

Tôi tự hào về thực tế là tôi đăng cùng một điều như @Jon Skeet, mặc dù hơi ít hùng hồn, chỉ 38 giây sau :) –

+1

Cảm ơn Jon. Điều đó xóa mọi thứ. Phần buồn cười là, tôi đã có câu hỏi sau khi đọc một đoạn mã từ cuốn sách của bạn. – Amrit

+0

Tôi nghĩ bạn cũng có thể chia lớp ngoài thành hai tệp nguồn thông qua các lớp một phần và có một trong các tệp nguồn chỉ chứa lớp lồng nhau và tệp nguồn khác chứa mọi thứ khác. Đây là loại lạm dụng các lớp học một phần; Tôi khuyên bạn không nên làm điều đó. – Brian

5

Lớp lồng nhau là một phần của lớp kèm theo, giống như phương thức. Việc phơi bày các thuộc tính riêng thông qua chúng không phá vỡ sự đóng gói nào ngoài việc phơi bày các thuộc tính riêng thông qua các phương thức.

Mô hình mà C# sử dụng để kiểm soát truy cập là bạn có thể truy cập bất kỳ thứ gì bạn muốn trong lớp bạn đang xác định và thật khó để xem cách thức hoạt động của nó.

2

(IMO) Loại lồng nhau là một phần của loại bao quanh và vì vậy nó phải có quyền truy cập vào các thành viên private - giống như bất kỳ phần nào khác thuộc loại đó.

Cũng giống như nếu bạn thực hiện bất kỳ phần nào khác của loại public, điều đó cũng có thể hiển thị thuộc tính riêng tư của loại.

Vì chỉ người đã viết kiểu kèm theo mới có thể viết loại lồng nhau, không có rủi ro thực sự?

Các vấn đề liên quan