Tính đóng gói trong hướng đối tượng C# và thắc mắc về getter, setter

Chào mọi người, mình muốn hỏi là tính đóng gói chỉ được thể hiện trong việc khai báo các biến là private và sử dụng hàm getter, setter để lấy và gán giá trị hay ngoài ra, đặc tính này còn được thể hiện ở đâu khác ?
Ngoài ra, khi mình sử dụng generate encapsuled field trong Visual Studio, thì mình được đoạn code như thế này

private int a;
public int A { get => a; set => a = value; }

Và mình xem 1 vài video hướng dẫn code thì thấy viết code như thế này:

private int a {get; set;}

Cho mình hỏi là sự khác nhau giữa 2 loại getter và setter này được không ạ. Về loại {get; set;} ở dưới thì mình thấy họ dùng cả trong biến có _protected_, mà mình nhớ khi khai báo protected thì các lớp con có quyền được truy cập vào thì có cần thiết sử dụng {get; set;} không.
Và cả trong cách viết code trong class có getter, setter. Mình nên dùng trực tiếp biến của class đó hay phải dùng thông qua getter; setter.
Cảm ơn mọi người trước

Loại get set thứ 2 là viết tắt của kiểu 1 trong trường hợp biến a không được dùng làm gì ở đâu khác.

Trong class dùng cách nào là tuỳ hoàn cảnh. Không có quy tắc cứng.

3 Likes

Tính đóng gói cũng có thể hiểu là việc nhóm các dữ liệu và hành vi để miêu tả một thực thể, giống như việc tạo ra 1 đối tượng vậy

Đóng gói nghĩa là…đóng gói, gom nhóm hết implementation và chỉ để lộ ra giao diện để thao tác.
Đơn giản: bạn thiết kế lib và framework sao cho “các coder cứ code, mọi chuyện đã có library và framework lo”.

Còn về getter và setter, nếu bạn muốn hành động lấy giá trị ra phải có hành động nào đó xen giữa (chuẩn hóa đầu ra, side effect, cấm dùng get v.v.) thì dùng getter, ngược lại tương tự với setter, còn nếu chỉ muốn gán và lấy bình thường thì không cần dùng. Do cách dạy học hời hợt và cách học có phần hời hợt của nhiều người nên cũng sinh ra khá nhiều người mù quáng dùng getter setter vô tội vạ.

3 Likes

^

@kiosoma1 thuộc tính là một phần của interface :smiley: (hiểu theo cả hai nghĩa) nên dùng public field sẽ làm hỏng interface.
Backing field tường minh private|protected dùng cho dạng get set đầy đủ, còn get set rút gọn {get; set;} đã có backing field ẩn.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?