Phạm vi truy cập của một đối tượng khi được khai báo protected là gì

Phạm vi truy cập của một đối tượng khi khai báo private là gì? A. Có thể được truy cập bất kỳ vị trí nào trong chương trình. B. Có thể được truy cập từ các lớp trong cùng package. C. Có thể được truy cập từ các lớp trong cùng package và lớp con nằm trong package khác.

D. Chỉ có thể truy cập từ các phương thức khác trong class đó.

Chọn D là đáp án đúng

Bạn phải đăng nhập hoặc đăng ký để bình luận.

Phạm vi truy cập là cách mà người lập trình quy định về quyền được truy xuất đến các thành phần của lớp.

Trong C# có 5 loại phạm vi truy cập:

Phạm vi truy cập Ý nghĩa
public Không hạn chế. Thành phần mang thuộc tính này có thể được truy cập ở bất kỳ nơi nào.
private Truy cập bị hạn chế trong phạm vi của định nghĩa Class. Đây là loại phạm vi truy cập mặc định nếu không được chính thức chỉ định
protected Truy cập bị giới hạn trong phạm vi định nghĩa của Class và bất kỳ các class con thừa kế từ class này.
internal Chỉ được truy cập trong cùng 1 Assembly [nói cách khác là cùng project]. Thuộc tính này thường được dùng cho class.
protected internal Truy cập bị giới hạn trong phạm vi Assembly hiện tại và trong class định nghĩa hoặc các class con.

Lưu ý:

  • Nếu khai báo lớp mà không chỉ ra phạm vi cụ thể thì phạm vi mặc định là internal.
  • Nếu khai báo thành phần bên trong lớp mà không chỉ ra phạm vi cụ thể thì phạm vị mặc định là private.

Bảng minh họa dưới đây cho bạn cái nhìn tổng quan về cách sử dụng các access modifier.

Cùng Assembly Khác Assembly Trong class định nghĩa? Trong class con Ngoài class định nghĩa, ngoài class con Trong class con Ngoài class con
private Y
protected Y Y Y
internal Y Y Y
protected internal Y Y Y
public Y Y Y Y Y

Trong tính đóng gói có 2 ý chính:

  • Các dữ liệu và phương thức có liên quan với nhau được đóng gói thành các lớp để tiện cho việc quản lý và sử dụng. Điều này được thể hiện qua cách ta xây dựng 1 class.
  • Đóng gói còn để che giấu một số thông tin và chi tiết cài đặt nội bộ để bên ngoài không thể nhìn thấy. Điều này được thể hiện qua các phạm vi truy cập đã trình bày ở trên. Cụ thể:
    •  Các thuộc tính thường sẽ có phạm vi là private. Vì đây chính là các thông tin nội bộ của lớp không thể để truy cập 1 cách tuỳ tiện được [che giấu thông tin].
    •  Các phương thức thường sẽ có phạm vi là public. Vì đây chính là các hành vi [thao tác] mà lớp hỗ trợ cho chúng ta thực hiện những công việc nhất định nên cần phải cho phép mọi người có thể sử dụng được.

Một ví dụ thực tế về tính đóng gói. Nhà sản xuất chế tạo ra 1 laptop thì họ phải đóng gói che giấu đi những mạch điện tử bên trong và chỉ để lộ ra màn hình, usb, cổng cắm sạc điện, lỗ cắm tai nghe.

private access modifier chỉ cho phép truy cập trong nội bộ một class.

Bạn không thể truy cập vào các thành viên private ở bên ngoài class định nghĩa thành viên đó. CSharp sẽ thông báo lỗi tại thời điểm biên dịch class.

Phương thức khởi tạo [constructor], phương thức [method], trường [field] đều được gọi là các thành viên trong class.

Nếu bạn tạo một class, và có một phương thức khởi tạo [constructor] có access modifier là private, bạn không thể tạo một đối tượng của class này từ private constructor đó từ bên ngoài class này. Hãy xem ví dụ minh họa:

protected access modifier có thể truy cập bên trong package, hoặc bên ngoài package nhưng phải thông qua tính kế thừa.

protected access modifier chỉ áp dụng cho fieldmethod và constructor. Nó không thể áp dụng cho class [class, interface, ..].

Độ truy cập protected internal là kết hợp giữa hai độ truy cập protected và internal, khi một thành viên của class có độ truy cập này, bạn chỉ có thể truy cập vào thành viên đó trong cùng class định nghĩa ra nó hoặc các class con và nằm trong cùng một Assembly.

public access modifier là mạnh mẽ nhất và có thể truy cập ở mọi nơi. Nó có phạm vi truy cập rộng nhất so với các modifier khác.

Trong CSharp bạn có thể ghi đè [override] một phương thức [method] của class cha bởi một phương thức cùng tên cùng tham số, cùng kiểu trả về tại class con, tuy nhiên bạn không được phép thay đổi độ truy cập [access modifier] của nó.

Tuy nhiên, bạn có thể tạo một phương thức cùng tên cùng tham số, cùng kiểu trả về nhưng khác độ truy cập nếu sử dụng từ khóanew, thực tế đây là một phương thức khác chẳng liên quan gì tới phương thức của class cha.

Một vấn đề đặt ra là nếu như mọi thuộc tính bên trong lớp đều là private thì khi người dùng bên ngoài muốn xem hoặc thay đổi giá trị thì phải làm sao?

Đến đây đòi hỏi người lập trình phải viết ra 1 cách nào đó để hỗ trợ người dùng làm điều này. Và cách để người dùng có thể xem hoặc thay đổi giá trị cho các thuộc tính bên trong lớp đó chính là thông qua các phương thức truy vấnphương thức cập nhật.

Phương thức truy vấn là phương thức giúp người dùng có thể xem được dữ liệu của 1 thuộc tính nào đó. Cụ thể, phương thức truy vấn chỉ cần trả về giá trị của thuộc tính tương ứng là đủ.

Phương thức cập nhật là phương thức giúp người dùng có thể thay đổi giá trị cho 1 thuộc tính nào đó. Cụ thể, phương thức cập nhật chỉ cần thực hiện cập nhật giá trị mới cho thuộc tính tương ứng [có thể kiểm tra tính đúng đắn của dữ liệu trước khi truyền vào].

Thực ra, phương thức truy vấn hay phương thức cập nhật chỉ là một phương thức bình thường. Về khai báo và sử dụng hoàn toàn như phương thức bình thường.

Một số quy ước nhỏ về cách đặt tên các phương thức này:

  • Những phương thức truy vấn nên bắt đầu bằng từ khoá get và kèm theo sau là tên thuộc tính tương ứng. Ví dụ: getHoTen[], getDiemToan[], . . .
  • Những phương thức cập nhật nên bắt đầu bằng từ khoá set và kèm theo sau là tên thuộc tính tương ứng. Ví dụ: setDiemToan[], setHoTen[], . . .
  • Nếu thuộc tính kiểu luận lý [bool] thì tên phương thức truy vấn nên bắt đầu bằng từ khoá is và kèm theo sau là tên thuộc tính tương ứng.
  • Phương thức truy vấn sẽ có kiểu trả về trùng với kiểu dữ liệu của thuộc tính tương ứng và không có tham số truyền vào.
  • Phương thức cập nhật sẽ có kiểu trả về là void và có 1 tham số truyền vào có kiểu dữ liệu trùng với kiểu dữ liệu của thuộc tính tương ứng.

Ví dụ:

Từ khoá get và set

Trong C#, phương thức truy xuất và phương thức cập nhật đã được nâng cấp lên thành 1 cấu trúc mới ngắn gọn hơn và tiện dụng hơn đó là property.

Sử dụng property giúp ta có thể thao tác dữ liệu tự nhiên hơn nhưng vẫn đảm bảo tính đóng gói của lập trình hướng đối tượng.

Cú pháp:

{

get { return ; }

set { = value; }

}

Trong đó:

  • là kiểu dữ liệu của property. Thường sẽ trùng với kiểu dữ liệu của thuộc tính private tương ứng bên trong lớp.
  • là tên do người dùng đặt và tuân theo quy tắc đặt tên đã trình bày trong bài Biến trong C#.
  • get, set, value là từ khoá có ý nghĩa:
    •  Từ khoá get tương đương với phương thức truy vấn.
    •  Từ khoá set tương đương với phương thức cập nhật.
    •  Từ khoá value đại diện cho giá trị mà người gán vào property [tương đương với tham số truyền vào của phương thức cập nhật].
  • là tên thuộc tính thực sự bên trong lớp.

Ví dụ:

Ta có 1 thuộc tính Salary cần được đóng gói. Khi đó ta sẽ có 1 property tương ứng để thực hiện điều này:

Rõ ràng là mọi thứ trở nên ngắn gọn hơn nhiều.

Khi sử dụng thì ta xem property như một thuộc tính đã được public.

Lưu ý:

  • Người ta dùng Property thay cho phương thức truy vấn, phương thức cập nhật vì thế tên property thường phải làm gợi nhớ đến tên thuộc tính private bên trong lớp.
  • Tuỳ theo nhu cầu và tính bảo mật mà người lập trình có thể ngăn không cho gán giá trị hoặc ngăn không cho lấy dữ liệu bằng cách bỏ đi từ khoá tương ứng.

Bạn hoàn toàn có thể viết những kiểm tra nếu muốn vào bên trong get, set.

Video liên quan

Chủ Đề