KH_WEB_CB_2026_01

KH_DSA_C_2026_01

KH_TT_CB_2026_01

KH_OOP_C_SHARP_2026_01

KH_OOP_C_SHARP_2026_01

🔒 Phạm Vi Truy Cập & Đóng Gói — Bí Mật Nội Tâm Của Object 💖

bởi Phạm Xuân Hoài - 8 tháng 2, 2026

🔒 Phạm Vi Truy Cập & Đóng Gói — Bí Mật Nội Tâm Của Object 💖

🎯 MỤC TIÊU

✅ Hiểu public / private / protected

✅ Biết vì sao không nên public hết

✅ Hiểu Encapsulation (Đóng gói)

✅ Dùng property (get / set) đúng cách

✅ Validate dữ liệu trong class

✅ Áp dụng vào mô hình CRUD thực tế


1️⃣ VẤN ĐỀ KHI PUBLIC HẾT ⚠️


Ví dụ sai (rất hay gặp)

class TaiKhoan
{
    public string soTK;
    public string ten;
    public double soDu;
}

Main ❌

TaiKhoan tk = new TaiKhoan();
tk.soDu = -1000000; // 😱 vỡ hệ thống

👉 Vấn đề:

  • Không kiểm soát dữ liệu
  • Ai cũng sửa được
  • Code dễ toang khi project lớn

2️⃣ PHẠM VI TRUY CẬP LÀ GÌ?


Từ khóaÝ nghĩa
publicAi cũng truy cập
privateChỉ trong class
protectedClass + class con

👉 Mặc định biến nên là private


3️⃣ PRIVATE — NỀN TẢNG CỦA OOP 🔒


Ví dụ sửa lại đúng

class TaiKhoan
{
    private double soDu;

    public void Nap(double tien)
    {
        soDu += tien;
    }

    public void HienThi()
    {
        Console.WriteLine("Số dư: " + soDu);
    }
}

Test

TaiKhoan tk = new TaiKhoan();
tk.Nap(5000);
tk.HienThi();

// tk.soDu = 999999 ❌ lỗi ngay

👉 An toàn hơn 100 lần


4️⃣ ENCAPSULATION (ĐÓNG GÓI) 📦


Định nghĩa dễ hiểu

Không cho sửa trực tiếp dữ liệu

→ Muốn sửa phải đi qua hàm / property


Ví dụ đời thật 🏧

  • Không ai vào ngân hàng tự sửa số dư
  • Phải qua quầy giao dịch

👉 OOP cũng vậy.


5️⃣ PROPERTY (GET / SET) 🔑


Cú pháp chuẩn

private double soDu;

public double SoDu
{
    get { return soDu; }
    set { soDu = value; }
}

Nhưng… phải VALIDATE 🚨

public double SoDu
{
    get { return soDu; }
    set
    {
        if (value >= 0)
            soDu = value;
    }
}

6️⃣ VÍ DỤ ĐỜI THẬT — SINH VIÊN 👨‍🎓


Class SinhVien (chuẩn OOP)

class SinhVien
{
    private string ten;
    private int tuoi;
    private double diem;

    public string Ten
    {
        get { return ten; }
        set
        {
            if (!string.IsNullOrEmpty(value))
                ten = value;
        }
    }

    public int Tuoi
    {
        get { return tuoi; }
        set
        {
            if (value >= 18)
                tuoi = value;
        }
    }

    public double Diem
    {
        get { return diem; }
        set
        {
            if (value >= 0 && value <= 10)
                diem = value;
        }
    }

    public void HienThi()
    {
        Console.WriteLine($"{ten} | {tuoi} | {diem}");
    }
}

Test

SinhVien sv = new SinhVien();

sv.Ten = "Hoài";
sv.Tuoi = 31;
sv.Diem = 9.5;

sv.HienThi();

7️⃣ BÀI CONSOLE — LÀM TỪNG BƯỚC 🧩


🎯 Đề bài: SẢN PHẨM

Yêu cầu:

  • Không cho giá < 0
  • Không cho tên rỗng

✍️ Bước 1 — Khai báo biến private

class SanPham
{
    private string ten;
    private double gia;
}

✍️ Bước 2 — Property

public string Ten
{
    get { return ten; }
    set
    {
        if (!string.IsNullOrEmpty(value))
            ten = value;
    }
}

public double Gia
{
    get { return gia; }
    set
    {
        if (value >= 0)
            gia = value;
    }
}

✍️ Bước 3 — Method hiển thị

public void HienThi()
{
    Console.WriteLine($"{ten} | {gia}");
}

Test

SanPham sp = new SanPham();

sp.Ten = "Bàn phím";
sp.Gia = -100; // ❌ bị chặn
sp.Gia = 300000;

sp.HienThi();

8️⃣ PROTECTED — MỞ ĐƯỜNG CHO KẾ THỪA 🔓


class NhanVien
{
    protected double luong;

    public double Luong
    {
        get { return luong; }
    }
}

📌 protected dùng nhiều ở Kế thừa


9️⃣ BÀI NÂNG CAO 🔥 QUẢN LÝ NHÂN VIÊN


Yêu cầu

  • Lương không < 0
  • Chỉ tăng lương, không cho giảm trực tiếp

Code

class NhanVien
{
    private string ten;
    private double luong;

    public string Ten
    {
        get { return ten; }
        set
        {
            if (!string.IsNullOrEmpty(value))
                ten = value;
        }
    }

    public double Luong
    {
        get { return luong; }
    }

    public void TangLuong(double tien)
    {
        if (tien > 0)
            luong += tien;
    }

    public void HienThi()
    {
        Console.WriteLine($"{ten} | {luong}");
    }
}

Test

NhanVien nv = new NhanVien();

nv.Ten = "Hoài";
nv.TangLuong(5000);
// nv.luong = -100 ❌ không thể

nv.HienThi();

🔟 PORT WINFORMS 🖥️


public class SanPham
{
    private string ten;
    private double gia;

    public string Ten
    {
        get { return ten; }
        set { ten = value; }
    }

    public double Gia
    {
        get { return gia; }
        set
        {
            if (value >= 0)
            {
                gia = value;
            }
        }
    }
}

UI bạn chèn

  • Label:

    • tên sản phẩm, giá sản phẩm (optional)
  • TextBox:

    • txtTenSanPham: tên sản phẩm
    • txtGia: giá sản phẩm
  • Button:

    • btnXacNhan: xác nhận
private void btnXacNhan_Click(object sender, EventArgs e)
{
    SanPham sp = new SanPham();

    // Sử dụng các thuộc tính (properties) để truy cập và gán giá trị
    sp.Ten = txtTenSanPham.Text;
    sp.Gia = double.Parse(txtGia.Text);

    MessageBox.Show($"Tên sản phẩm: {sp.Ten}\nGiá: {sp.Gia}");
}

Buoi03PhamViTruyCapVaDongGoiTrongCSharp


📌 TỔNG KẾT


Học được gì?

✅ Vì sao không public hết

✅ private để bảo vệ dữ liệu

✅ Encapsulation là nền móng OOP

✅ get / set đúng cách

✅ Validate dữ liệu trong class