VieTopikKhoá học
  • Games
  • Cá nhân
Tải app
© 2026 VieTopikChính sách bảo mậtĐiều khoản sử dụngCài appEnglish
  • Trang chủ
  • Học
  • Luyện thi
  • Cẩm nang
  • Games
  • Cá nhân
OOP và thiết kếBốn trụ cột OOP
Bài 1/12
5 phút

Đóng gói

Bình luận
Nội dung bài · 5 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt

Khoá này dạy cách tổ chức nhiều class cho dễ sửa, bắt đầu từ đóng gói. Tồn kho của một sản phẩm bỗng thành số âm vì năm chỗ cùng gán thẳng product.Stock = ... và một chỗ quên kiểm tra. Đóng gói chặn việc này bằng cách chỉ cho sửa dữ liệu qua đúng một cửa.

Khái niệm

🔒 Đóng gói (encapsulation): giấu dữ liệu bên trong class, chỉ cho thay đổi qua method của class để object luôn hợp lệ.

🚪 Access modifier: từ khoá quy định ai được dùng một thành viên của class.

Từ khoá Ai dùng được
public mọi nơi
private chỉ code bên trong class đó

Thành viên không ghi gì thì mặc định là private.

Ví dụ

var pen = new Product("Bút bi");
pen.Restock(100);
pen.Sell(30);
Console.WriteLine(pen.Stock);   // 70

class Product
{
    public string Name { get; }
    public int Stock { get; private set; }

    public Product(string name)
    {
        Name = name;
    }

    public void Restock(int quantity)
    {
        if (quantity <= 0)
        {
            throw new ArgumentException(
                "Số lượng phải lớn hơn 0");
        }
        Stock = Stock + quantity;
    }

    public void Sell(int quantity)
    {
        if (quantity <= 0)
        {
            throw new ArgumentException(
                "Số lượng phải lớn hơn 0");
        }
        if (quantity > Stock)
        {
            throw new InvalidOperationException(
                "Không đủ hàng");
        }
        Stock = Stock - quantity;
    }
}
  • { get; private set; }: bên ngoài đọc được Stock, nhưng chỉ code trong Product mới gán được. { get; } chỉ gán được trong constructor, còn private set cho mọi method trong class gán lại nhiều lần.
  • Muốn đổi tồn kho thì phải gọi Restock hoặc Sell. Quy tắc "số lượng phải dương, không bán quá số đang có" chỉ nằm trong hai method này.
  • Không nơi nào khác trong chương trình làm Stock âm được nữa.

Thử ngay

Chép ví dụ trên vào Program.cs, thay các dòng đầu bằng:

var pen = new Product("Bút bi");
pen.Restock(5);

try
{
    pen.Sell(3);
    pen.Sell(10);
}
catch (InvalidOperationException ex)
{
    Console.WriteLine(ex.Message);
}

Console.WriteLine(pen.Stock);

Đoán trước khi chạy: lệnh bán 10 cái bị chặn. Vậy Stock cuối cùng là 5, 2 hay -8?

Xem kết quả
Không đủ hàng
2

Là 2. Bán 3 cái thành công. Lệnh bán 10 bị Sell chặn trước khi trừ, nên Stock không bao giờ âm.

Lỗi hay gặp

Để set công khai. Nơi nào cũng gán thẳng được, và quy tắc trong Sell bị bỏ qua.

// SAI — nơi khác gán thẳng, bỏ qua mọi kiểm tra
var pen = new Product();
pen.Stock = -5;

class Product
{
    public int Stock { get; set; }
}
// ĐÚNG — chỉ đổi được qua method của class
var pen = new Product();
pen.Restock(5);

class Product
{
    public int Stock { get; private set; }

    public void Restock(int quantity)
    {
        if (quantity <= 0)
        {
            throw new ArgumentException(
                "Số lượng phải lớn hơn 0");
        }
        Stock = Stock + quantity;
    }
}

Tóm tắt

  • Đóng gói: dữ liệu để private, chỉ đổi qua method của class.
  • public dùng được ở mọi nơi, private chỉ dùng được trong class.
  • { get; private set; } cho bên ngoài đọc mà không cho ghi.
  • Quy tắc kiểm tra nằm trong method của class, không rải ở nơi gọi.
Kế thừa

Bình luận

Đang tải bình luận…

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt