Skip to content

Encapsulation (Đóng gói)

VirtueSky edited this page Dec 9, 2024 · 11 revisions

1. Properties (Thuộc tính)

  • Các biến có phạm vi truy cập là private chỉ có thể truy cập được trong cùng một lớp (lớp bên ngoài không thể truy cập vào nó). Tuy nhiên, đôi khi chúng ta vẫn cần truy cập chúng và điều này sẽ được thực hiện bằng các thuộc tính.

  • Thuộc tính trông giống như sự kết hợp giữa một biến và một phương thức, nó có hai phương thức là getset

  • Ví dụ:

class Person
{
  private string name; // field

  public string Name   // property
  {
    get { return name; }   // get method
    set { name = value; }  // set method
  }
}
  • Từ ví dụ trên có thể thấy được rằng thuộc tính Name được liên kết với trường name. Phương thức get trả về giá trị biến nameset sẽ gán value cho biến name.

  • Lúc này ta có thể truy cập biến name thông qua thuộc tính Name vì thuộc tính này có phạm vi truy cập là public.

  • Ví dụ:

class Person
{
  private string name; // field
  public string Name   // property
  {
    get { return name; }
    set { name = value; }
  }
}

class Program
{
  static void Main(string[] args)
  {
    Person myObj = new Person();
    myObj.Name = "VirtueSky";
    Console.WriteLine(myObj.Name);
  }
}

2. Automatic Properties (Short Hand)

  • C# cung cấp một cách để sử dụng các thuộc tính viết tắt/tư động, trong đó bạn không phải định nghĩa trường cho thuộc tính mà chỉ cần viết get;set; bên trong thuộc tính.

  • Ví dụ:

class Person
{
  public string Name  // property
  { get; set; }
}

class Program
{
  static void Main(string[] args)
  {
    Person myObj = new Person();
    myObj.Name = "VirtueSky";
    Console.WriteLine(myObj.Name);
  }
}

3. Encapsulation (Đóng gói)

  • Thuộc tính giúp ngăn chặn việc truy cập trực tiếp đến các trường. Bạn có thể đọc hoặc ghi dữ liệu thông qua thuộc tính.

  • Ví dụ:

  private string name; // field
  public string Name   // property
  {
    get { return name; }
    private set { name = value; }
  }

Ví dụ trên cho thấy các class bên ngoài chỉ có thể get giá trị thông qua thuộc tính Name mà không thể set vì phương thức set đã bị private.

  • Như vậy tính đóng gói chính là việc giới hạn quyền truy cập giá trị của thuộc tính hoặc quyền gọi phương thức (có thể hiểu là che giấu dữ liệu).

Sự linh hoạt trong việc cấp quyền truy cập

  • Khi ta muốn che dấu dữ liệu thì ta cần private các trường.
class Person
{
  private string name; // field
}
  • Bên ngoài lớp có thể lấy được giá trị của trường nhưng không thay đổi được giá trị của trường
class Person
{
  private string name; // field

  public string Name   // property
  {
    get { return name; }   // get method
    private set { name = value; }  // set method
  }
}
  • Bên ngoài vừa có thể lấy được giá trị vừa có thể thay đổi giá trị của trường
class Person
{
  private string name; // field

  public string Name   // property
  {
    get { return name; }   // get method
    set { name = value; }  // set method
  }
}

Tại sao ta cần đóng gói?

  • Đóng gói để có thể kiểm soát tốt hơn các thành viên lớp, không cho phép truy cập và thay đổi đổi giá trị của các trường trong lớp một cách tùy tiện (giảm khả năng làm hỏng mã)
  • Các trường có thể thiết lập chỉ đọc (nếu bạn chỉ sử dụng get) hoặc chỉ ghi (nếu bạn chỉ sử dụng set)
  • Tăng cường tính bảo mật cho mã
Previous page Next page
OOP page Access Modifiers Inheritance