Công khai, riêng tư và bảo vệ trong lập trình hướng đối tượng là gì?


93

Công khai, riêng tư và bảo vệ trong lập trình hướng đối tượng là gì?


+1, một trong những điều tôi tìm thấy một chút khó khăn để grok

Câu trả lời:


152

Chúng là công cụ sửa đổi quyền truy cập và giúp chúng ta thực hiện Encapsulation (hoặc ẩn thông tin). Chúng cho trình biên dịch biết lớp nào khác nên có quyền truy cập vào trường hoặc phương thức đang được định nghĩa.

private - Chỉ lớp hiện tại mới có quyền truy cập vào trường hoặc phương thức.

protected - Chỉ lớp hiện tại và các lớp con (và đôi khi cả các lớp cùng gói) của lớp này mới có quyền truy cập vào trường hoặc phương thức.

public - Bất kỳ lớp nào cũng có thể tham chiếu đến trường hoặc gọi phương thức.

Điều này giả định rằng các từ khóa này được sử dụng như một phần của khai báo trường hoặc phương thức trong định nghĩa lớp.


4
lưu ý rằng trong java, các thành viên của cùng một gói có thể truy cập các thành viên được bảo vệ
Landon Kuhn

2
Có, và Java cũng có một công cụ sửa đổi quyền truy cập thứ tư là chuỗi trống. Không cung cấp bất kỳ công cụ sửa đổi quyền truy cập nào sẽ cho phép truy cập từ bất kỳ lớp cấp độ gói nào.
Ben S

1
Tôi thích phần "trình biên dịch", bởi vì hầu hết các ngôn ngữ mà tôi biết, tất cả các hàm / lớp đều có thể dễ dàng truy cập trong thời gian chạy, ví dụ thông qua phản xạ trong .NET. Do đó, tôi có xu hướng nói rằng các công cụ sửa đổi quyền truy cập này về cơ bản chỉ là một sự trợ giúp cho các lập trình viên hướng dẫn các lập trình viên khác làm việc trên / với cùng một đoạn mã bằng cách ẩn một số thứ nhất định.
merkuro

1
Một số ngôn ngữ có một số đặc điểm. Giống như trong Delphi, các thành viên riêng tư có thể truy cập được bởi các lớp khác trên cùng một đơn vị và bạn phải sử dụng chế độ riêng tư nghiêm ngặt nếu bạn không muốn hành vi này.
Fabio Gomes

1
C # cũng thực hiện thủ thuật được bảo vệ bằng quyền truy cập-các thành viên của cùng một gói. Về bản chất, C # chỉ là Java của Microsoft
iGbanam 23/11/12

6

Chúng không thực sự là khái niệm mà là những từ khóa cụ thể có xu hướng xuất hiện (với ngữ nghĩa hơi khác nhau) trong các ngôn ngữ phổ biến như C ++ và Java.

Về cơ bản, chúng có nghĩa là cho phép một lớp hạn chế quyền truy cập vào các thành viên (trường hoặc chức năng). Ý tưởng là càng ít một loại được phép truy cập trong một loại khác, thì càng ít phụ thuộc càng có thể được tạo ra. Điều này cho phép thay đổi đối tượng được truy cập dễ dàng hơn mà không ảnh hưởng đến các đối tượng tham chiếu đến nó.

Nói rộng ra, public nghĩa là mọi người đều được phép truy cập, private có nghĩa là chỉ các thành viên của cùng một lớp mới được phép truy cập và được bảo vệ có nghĩa là các thành viên của các lớp con cũng được phép. Tuy nhiên, mỗi ngôn ngữ lại thêm những thứ riêng vào điều này. Ví dụ, C ++ cho phép bạn kế thừa không công khai. Trong Java, cũng có mức truy cập (gói) mặc định và có các quy tắc về các lớp bên trong, v.v.


6

Cả ba đều là công cụ sửa đổi quyền truy cập và từ khóa được sử dụng trong một lớp. Bất cứ thứ gì được khai báo public đều có thể được sử dụng bởi bất kỳ đối tượng nào trong lớp hoặc bên ngoài lớp, các biến trong private chỉ có thể được sử dụng bởi các đối tượng trong lớp và không thể thay đổi thông qua truy cập trực tiếp (vì nó có thể thay đổi thông qua các hàm như hàm friend) .Bất kỳ thứ gì được định nghĩa trong phần được bảo vệ đều có thể được sử dụng bởi lớp và lớp dẫn xuất của chúng.


1

Mục công khai là mục có thể truy cập được từ bất kỳ lớp nào khác. Bạn chỉ cần biết đối tượng đó là gì và có thể sử dụng toán tử dấu chấm để truy cập nó. Được bảo vệ có nghĩa là một lớp và các lớp con của nó có quyền truy cập vào biến, chứ không phải bất kỳ lớp nào khác, chúng cần sử dụng getter / setter để làm bất cứ điều gì với biến. Riêng tư có nghĩa là chỉ lớp đó có quyền truy cập trực tiếp vào biến, mọi thứ khác cần một phương thức / hàm để truy cập hoặc thay đổi dữ liệu đó. Hi vọng điêu nay co ich.


1

như trên, nhưng về mặt chất lượng:

private - least access, best encapsulation
protected - some access, moderate encapsulation
public - full access, no encapsulation

bạn càng cung cấp ít quyền truy cập thì càng ít chi tiết triển khai lọt ra ngoài các đối tượng của bạn. Loại rò rỉ ít hơn có nghĩa là linh hoạt hơn (hay còn gọi là "khớp nối lỏng hơn") về mặt thay đổi cách một đối tượng được triển khai mà không phá vỡ các ứng dụng khách của đối tượng. đây là một điều thực sự cơ bản để hiểu.


0

Tóm lại, trong lập trình hướng đối tượng, mọi thứ đều được mô hình hóa thành các lớp và đối tượng. Các lớp chứa các thuộc tính và phương thức. Các từ khóa công khai, riêng tư và được bảo vệ được sử dụng để chỉ định quyền truy cập vào các thành viên này (thuộc tính và phương thức) của một lớp từ các lớp khác hoặc .dlls khác hoặc thậm chí các ứng dụng khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.