Bộ điều chỉnh quyền truy cập
Thuộc phần Lập trình hướng đối tượng trong hành trình C# của Coddy. Bài học 31 trên 70.
Bộ điều chỉnh quyền truy cập kiểm soát ai có thể xem và sử dụng các thành viên trong lớp của bạn. Chúng là nền tảng của tính đóng gói, một trong những nguyên tắc cốt lõi của OOP. Bằng cách giới hạn quyền truy cập, bạn bảo vệ dữ liệu và tạo ranh giới rõ ràng trong code.
C# có bốn bộ điều chỉnh quyền truy cập chính:
public class BankAccount
{
public string AccountHolder; // Có thể truy cập từ mọi nơi
private decimal balance; // Chỉ truy cập được trong lớp này
protected string accountType; // Có thể truy cập trong lớp này và các lớp dẫn xuất
internal int branchCode; // Có thể truy cập trong cùng một assembly
}Các thành viên public có thể được truy cập từ mọi đoạn code.
Chỉ có thể truy cập các thành viên private trong cùng một lớp. Đây là mức hạn chế nhất và là mặc định cho các thành viên của lớp.
protected cho phép truy cập từ chính lớp đó và mọi lớp kế thừa từ lớp đó.
internal giới hạn quyền truy cập vào code trong cùng một assembly (dự án).
Khi không chỉ định bộ điều chỉnh nào, các thành viên của lớp mặc định là private:
class Example
{
int secret; // mặc định là riêng tư
}Chọn đúng cấp độ truy cập nghĩa là chỉ để lộ những gì cần thiết. Hãy bắt đầu với private và chỉ tăng mức độ hiển thị khi bạn có lý do rõ ràng. Cách này ngăn code khác phụ thuộc vào các chi tiết triển khai mà sau này bạn có thể muốn thay đổi.
Thử thách
DễHãy xây dựng một hệ thống hồ sơ người dùng an toàn để minh họa cách các từ bổ trợ quyền truy cập bảo vệ dữ liệu nhạy cảm, đồng thời chỉ hiển thị những gì cần thiết. Bạn sẽ tạo một lớp có các mức hiển thị khác nhau cho từng loại thông tin, tùy theo đối tượng được phép truy cập.
Bạn sẽ sắp xếp code trong ba tệp:
UserProfile.cs: Tạo lớpUserProfiletrong không gian tênSecurityđể quản lý thông tin người dùng với các mức truy cập phù hợp. Hồ sơ cần có:- Thuộc tính
publicUsername(chuỗi), bất kỳ ai cũng có thể xem tên người dùng - Trường
privatepassword(chuỗi), chỉ bản thân lớp mới có thể truy cập trường này - Trường
protectedemail(chuỗi), lớp này và các lớp con có thể truy cập trường này - Trường
internaluserId(số nguyên), có thể truy cập trong cùng một assembly
publiccó tênGetPublicInfo(), trả về"User: {Username}". Thêm một phương thứcpublickhác có tênValidatePassword(string input), trả vềtruenếu đầu vào khớp với mật khẩu private, nếu không thì trả vềfalse.- Thuộc tính
AdminProfile.cs: Tạo lớpAdminProfiletrong không gian tênSecurity, kế thừa từUserProfile. Lớp này minh họa cách các thành viênprotectedcó thể được truy cập trong lớp dẫn xuất. Hàm khởi tạo cần nhận cùng bốn tham số và truyền chúng cho hàm khởi tạo của lớp cơ sở. Thêm một phương thứcpubliccó tênGetAdminInfo(), trả về"Admin: {Username}, Email: {email}". Lưu ý rằng bạn có thể truy cập trườngemailđược bảo vệ tại đây!Program.cs: Trong tệp chính, tạo một đối tượngUserProfilevà một đối tượngAdminProfilebằng các giá trị đầu vào. Minh họa các mức truy cập bằng cách gọi những phương thức public có sẵn và truy cập trực tiếp vào trường internal (vì bạn đang ở trong cùng một assembly). Cho biết mỗi loại người dùng có thể tiết lộ thông tin nào.
Bạn sẽ nhận năm đầu vào:
- Tên người dùng
- Mật khẩu
- ID người dùng (số nguyên)
- Mật khẩu cần kiểm tra
In đầu ra theo định dạng sau:
Regular User:
{GetPublicInfo() result}
Internal ID: {userId}
Password valid: {ValidatePassword result}
Admin User:
{GetAdminInfo() result}Ví dụ, nếu đầu vào là alice, secret123, alice@email.com, 1001 và secret123, đầu ra sẽ là:
Regular User:
User: alice
Internal ID: 1001
Password valid: True
Admin User:
Admin: alice, Email: alice@email.comLưu ý rằng mật khẩu luôn được ẩn hoàn toàn, bạn chỉ có thể kiểm tra mật khẩu chứ không thể lấy lại mật khẩu. Email được bảo vệ, nên chỉ AdminProfile (một lớp dẫn xuất) mới có thể hiển thị email. Tệp chính của bạn có thể truy cập userId internal vì nó nằm trong cùng một assembly. Đây chính là tính đóng gói!
Tự làm thử
using System;
using Security;
class Program
{
public static void Main(string[] args)
{
// Đọc các giá trị đầu vào
string username = Console.ReadLine();
string password = Console.ReadLine();
string email = Console.ReadLine();
int userId = Convert.ToInt32(Console.ReadLine());
string passwordAttempt = Console.ReadLine();
// TODO: Tạo đối tượng UserProfile bằng các giá trị đầu vào
// TODO: Tạo đối tượng AdminProfile bằng cùng các giá trị đầu vào
// TODO: In ra "Regular User:"
// TODO: In ra kết quả của GetPublicInfo()
// TODO: In ra "Internal ID: " rồi đến trường userId (có thể truy cập vì nằm trong cùng assembly)
// TODO: In ra "Password valid: " rồi đến kết quả của ValidatePassword()
// TODO: In ra "Admin User:"
// TODO: In ra kết quả của GetAdminInfo()
}
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Các khái niệm cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiKhông gian tên và chỉ thịGiới thiệu về lớp và đối tượngTừ khóa thisPhương thức và tham sốTrường và thuộc tínhHàm khởi tạoKhởi tạo đối tượngÔn tập: Máy tính đơn giản4Kế thừa
Cú pháp kế thừa cơ bản (:)Từ khóa 'base'Từ khóa virtual và overrideLớp sealedLớp cơ sở 'object'Ôn tập: hệ phân cấp nhân viên7Tính năng nâng cao
Nạp chồng toán tửBộ lập chỉ mục (this[])Ghi đè ToString()Phương thức mở rộngÔn tập: Danh sách tùy chỉnh10Các mẫu thiết kế phần 1
Giới thiệu về mẫu thiết kếSingleton an toàn với luồngMẫu FactoryMẫu Observer (sự kiện)Mẫu Strategy2Thuộc tính và thành viên tĩnh
Thuộc tính tự độngThuộc tính chỉ đọc hoặc chỉ ghiTrường và phương thức tĩnhLớp tĩnhThành viên có thân biểu thức5Đa hình và interface
Đa hình lúc biên dịch và lúc chạyInterface và lớp trừu tượngNhiều interfaceInterface tường minhUpcasting và downcastingÔn tập: bộ tính toán hình học8Các khái niệm OOP nâng cao
Ưu tiên composition hơn kế thừaGenerics (lớp và phương thức)Delegate và sự kiệnAttribute và reflectionGiao diện IDisposable và câu lệnh usingKiến thức cơ bản về dependency injection11Các mẫu thiết kế phần 2
Mẫu lệnhMẫu bộ chuyển đổiMẫu trang tríMẫu phương thức khuôn mẫuMẫu trạng tháiMẫu tổ hợp3Kiến trúc lớp
Dữ liệu instance và dữ liệu tĩnhTừ khóa 'readonly' và 'const'Trường lưu trữÔn tập: Trình quản lý tài khoản ngân hàng6Đóng gói
Bộ điều chỉnh quyền truy cậpThuộc tính để đóng góiTriển khai ẩn dữ liệuCác mẫu bất biếnÔn tập: hồ sơ học sinhTự luyện tập: Trình biên dịch C# online