2009-08-18 21 views
5

Tôi hiểu rằng quy tắc chung trong OOD là giảm thiểu quyền truy cập vào tất cả các thành viên của một đối tượng nhất định có thể được thực hiện hợp lý.Thực hành sửa đổi truy cập tốt nhất trong C# so với Java

C# và Java cả hai dường như triển khai cùng một bộ công cụ sửa đổi truy cập; Tuy nhiên, một cái gì đó đã hoang mang tôi một thời gian bây giờ là lý do tại sao các lớp Java dường như chủ yếu được tuyên bố là công khai trong khi các lớp C# dường như chủ yếu được khai báo là mặc định.Có một số sự tinh tế đối với những ngôn ngữ này áp đặt những khác biệt này hay chỉ đơn giản là vấn đề về quy ước hay gì?

Tôi thấy mình thường xuyên trải qua mã C# (thường xuyên làm cho hầu hết các lớp công khai, ngoại trừ lớp bên trong, lớp ẩn danh và các lớp phạm vi hẹp và hữu dụng khác). Tôi có thể thiếu một cái gì đó quan trọng.

+2

(tất cả các ý kiến ​​liên quan đến thực tế là nó đóng cửa chưa hoàn thành; tôi đã xóa chúng, vì họ không thêm gì bây giờ là câu hỏi đã được sửa và mở lại) –

Trả lời

1

Điều duy nhất tôi công khai là biến tĩnh/cuối cùng, thường là hằng số. Mọi thứ khác là riêng tư và truy cập được thực hiện thông qua các phương thức getXXX() và setXXX(), khi thích hợp. Các phương thức setXXX() cũng thực hiện bất kỳ xác thực nào đối với dữ liệu. Nếu tôi phải làm gì đó được bảo vệ, tôi sẽ, nhưng tôi thường tránh nó.

+1

Rõ ràng, toàn bộ câu hỏi đã thay đổi kể từ khi tôi đăng bài này. .. –

+0

yea tôi lên bình chọn từ câu trả lời của bạn là chính xác trước khi tôi thay đổi toàn bộ điều ... nó thực sự được lưu vô tình trước khi tôi đã được thực hiện đánh máy. cảm ơn tho! –

5

Tôi nghĩ bạn đã trả lời câu hỏi của mình. Theo Joshua Bloch, "Quy tắc của ngón tay cái rất đơn giản, làm cho mỗi lớp hoặc thành viên không thể tiếp cận được càng tốt." Effective Java

0

Ít "khách hàng" (mã khác) biết về hoạt động bên trong lớp học của bạn, anh ta sẽ được hưởng lợi nhiều hơn ... Quy tắc trừu tượng đơn giản và trụ cột cơ bản của OOP. Câu trả lời đúng đã được đưa ra ở trên:

"Quy tắc chung đơn giản, làm cho mỗi lớp hoặc thành viên không thể truy cập được càng tốt." ~ Joshua Bloch

6

Java's scoping hơi khác so với C#'s scoping.

Điều này được nói ngắn gọn trong C# From a Java Developer's Perspective của cùng một, nhưng khác nhau: Access Modifiers. Tài liệu này hiện đã được cập nhật một chút nhưng vẫn chủ yếu là có liên quan.

Danh sách đó có hai sai lầm:

  1. C# 's internal tương đương với phạm vi mặc định của Java (đó là phạm vi riêng của mình).
  2. C# 's internal protected tương đương với số protected của Java.

Ngoài ra, tài liệu trên không đề cập đến những gì trình sửa đổi truy cập mặc định là dành cho lớp học, chỉ cho phương pháp và thuộc tính/biến.

Để tham khảo, phạm vi mặc định cho các lớp trong C# là nội bộ. Java là phạm vi mặc định thông thường của nó, như được mô tả trước đó.

+1

vì vậy từ những gì tôi thu thập nội bộ là 1 bước xuống từ công chúng về khả năng truy cập. java doesnt thực sự có nội bộ để công khai có ý nghĩa cho mục đích chung ood.công chúng không có ý nghĩa đối với hầu hết phát triển C# trừ khi bạn đang viết thư viện lớp để xuất. do đó mặc định hoặc nội bộ phù hợp với hầu hết các nhà phát triển. điều này có đúng không? –

+9

Bảo vệ nội bộ và bên trong của C# không tương đương với phạm vi mặc định của Java hoặc được bảo vệ bởi Java. Các lớp bên trong C# có thể truy cập từ cùng một assembly. Assemblies về bản chất là .exes hoặc .dlls. Nếu Java cho phép các công cụ sửa đổi truy cập bằng tệp .jar thì điều này sẽ giống nhau, nhưng không. – FkYkko

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