Menu
CoddyTech

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.

challenge icon

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ớp UserProfile trong không gian tên Security để 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 public Username (chuỗi), bất kỳ ai cũng có thể xem tên người dùng
    • Trường private password (chuỗi), chỉ bản thân lớp mới có thể truy cập trường này
    • Trường protected email (chuỗi), lớp này và các lớp con có thể truy cập trường này
    • Trường internal userId (số nguyên), có thể truy cập trong cùng một assembly
    Thêm hàm khởi tạo nhận username, password, email và userId. Thêm một phương thức public có tên GetPublicInfo(), trả về "User: {Username}". Thêm một phương thức public khác có tên ValidatePassword(string input), trả về true nếu đầu vào khớp với mật khẩu private, nếu không thì trả về false.
  • AdminProfile.cs: Tạo lớp AdminProfile trong không gian tên Security, kế thừa từ UserProfile. Lớp này minh họa cách các thành viên protected có 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ức public có tên GetAdminInfo(), trả về "Admin: {Username}, Email: {email}". Lưu ý rằng bạn có thể truy cập trường email được bảo vệ tại đây!
  • Program.cs: Trong tệp chính, tạo một đối tượng UserProfile và một đối tượng AdminProfile bằ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
  • Email
  • 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.com

Lư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()
    }
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch C# online