Tính trừu tượng (Abstraction) trong C# là gì? Ví dụ Abstract Class & Interface dễ hiểu
Tính trừu tượng (Abstraction) là một trong bốn trụ cột quan trọng của lập trình hướng đối tượng (OOP) trong C# (bên cạnh Encapsulation, Inheritance và Polymorphism).
Bài viết này sẽ giúp bạn:
- Hiểu đúng tính trừu tượng là gì
- Phân biệt Abstract Class và Interface
- Hiểu rõ ứng dụng thực tế trong C#
- Xem ví dụ dễ hiểu, sát thực tế
1. Tính trừu tượng (Abstraction) là gì?
Tính trừu tượng cho phép lập trình viên:
- Chỉ quan tâm đến những hành vi chung
- Ẩn đi chi tiết cài đặt cụ thể
- Làm việc thông qua kiểu cha thay vì lớp con
👉 Biết đối tượng làm được gì, không cần biết làm như thế nào.
Trong C#, trừu tượng được thể hiện qua:
abstract classinterface
2. Ví dụ thực tế: Citizen – Student – Teacher
Giả sử ta xây dựng hệ thống quản lý công dân, trong đó:
- Sinh viên
- Giáo viên
đều là Citizen
3. Abstract Class trong C#
Khai báo lớp trừu tượng Citizen
public abstract class Citizen
{
public string Name { get; set; }
protected Citizen(string name)
{
Name = name;
}
// Phương thức trừu tượng
public abstract void Work();
}
👉 Citizen không thể khởi tạo trực tiếp
👉 Chỉ dùng để làm khuôn mẫu chung
Lớp Student kế thừa Citizen
public class Student : Citizen
{
public Student(string name) : base(name) { }
public override void Work()
{
Console.WriteLine($"{Name} đang đi học");
}
}
Lớp Teacher kế thừa Citizen
public class Teacher : Citizen
{
public Teacher(string name) : base(name) { }
public override void Work()
{
Console.WriteLine($"{Name} đang giảng dạy");
}
}
4. Khởi tạo đối tượng theo cách thông thường
Student s = new Student("An");
Teacher t = new Teacher("Bình");
❌ Nhược điểm:
- Code phụ thuộc trực tiếp vào lớp con
- Khó mở rộng, khó bảo trì
5. Khởi tạo theo tính trừu tượng (Abstraction)
Citizen c1 = new Student("An");
Citizen c2 = new Teacher("Bình");
Điều gì đang xảy ra?
- Khi viết code →
c1,c2làCitizen - Khi chương trình chạy (runtime):
c1làStudentc2làTeacher
c1.Work(); // An đang đi học
c2.Work(); // Bình đang giảng dạy
👉 Đây là đa hình (Polymorphism)
👉 Và nó chỉ tồn tại nhờ tính trừu tượng
6. Vì sao IntelliSense không thấy method của Student?
c1. IDE chỉ gợi ý các method của Citizen, không phải Student.
👉 Vì kiểu khai báo của c1 là Citizen
✔ Giúp code an toàn
✔ Giảm phụ thuộc
✔ Đúng chuẩn thiết kế OOP
7. Quản lý nhiều đối tượng bằng tính trừu tượng
List<Citizen> citizens = new List<Citizen>
{
new Student("An"),
new Teacher("Bình"),
new Student("Cường")
};
foreach (var citizen in citizens)
{
citizen.Work();
}
👉 Không cần quan tâm đó là Student hay Teacher
👉 Chỉ cần biết đó là Citizen
8. Interface trong C# là gì?
Interface là một dạng trừu tượng thuần túy hơn:
- Không chứa logic
- Chỉ định nghĩa hành vi
- Một class có thể implement nhiều interface
Ví dụ Interface IWorkable
public interface IWorkable
{
void Work();
}
Citizen implement Interface
public abstract class Citizen : IWorkable
{
public string Name { get; set; }
protected Citizen(string name)
{
Name = name;
}
public abstract void Work();
}
👉 Interface giúp chuẩn hóa hành vi
👉 Abstract class giúp tái sử dụng code chung
9. So sánh Abstract Class và Interface
| Tiêu chí | Abstract Class | Interface |
|---|---|---|
| Có field | ✅ Có | ❌ Không |
| Có constructor | ✅ Có | ❌ Không |
| Kế thừa nhiều | ❌ Không | ✅ Có |
| Chứa logic | ✅ Có | ❌ (trước C# 8) |
👉 Thực tế: kết hợp cả hai là cách làm phổ biến nhất
10. Ứng dụng thực tế của tính trừu tượng
✔ Xây dựng hệ thống lớn
✔ Viết code dễ mở rộng
✔ Áp dụng Dependency Injection
✔ Dùng trong MVC, Clean Architecture, Microservices
11. Tổng kết
- Tính trừu tượng giúp code linh hoạt, dễ bảo trì
- Luôn khai báo bằng abstract / interface
- Khởi tạo bằng class cụ thể
- Trừu tượng là nền tảng của đa hình
💡 Code tốt không phải là code chạy được, mà là code dễ mở rộng về sau.
Leave a comment
Your email address will not be published. Required fields are marked *