Abstract class là gì? So sánh abstract class và interface chi tiết

Đã kiểm duyệt nội dung
Đánh giá
Abstract class là một lớp trừu tượng dùng làm nền tảng cho các lớp khác kế thừa và không được khởi tạo trực tiếp. Trong bài viết này, mình sẽ cùng bạn tìm hiểu rõ hơn về abstract class, từ đặc điểm nổi bật, cách hoạt động trong Java/PHP/C#, sự khác nhau với interface và cách lựa chọn cho từng tình huống thực tế.
Những điểm chính
- Khái niệm và ví dụ: Hiểu rõ Abstract class là một lớp trừu tượng dùng làm lớp cơ sở, giúp bạn nhận biết vai trò của nó trong việc định nghĩa một bộ khung chung cho các lớp con.
- Đặc điểm: Nắm vững các đặc điểm cốt lõi như không thể khởi tạo trực tiếp và bắt buộc lớp con phải triển khai các phương thức trừu tượng, giúp bạn sử dụng abstract class một cách chính xác.
- Ứng dụng trong các ngôn ngữ phổ biến: Tìm hiểu cách abstract class được triển khai trong Java, PHP và C#, giúp bạn áp dụng vào các dự án thực tế với từng ngôn ngữ cụ thể.
- So sánh với Interface: Phân biệt rõ ràng sự khác biệt về đa kế thừa, constructor và các loại thành viên, giúp bạn lựa chọn đúng công cụ trừu tượng hóa phù hợp với từng kịch bản thiết kế.
- Tiêu chí lựa chọn: Nắm vững các trường hợp nên sử dụng abstract class và khi nào nên dùng interface, giúp bạn đưa ra quyết định kiến trúc sáng suốt để xây dựng hệ thống linh hoạt và dễ bảo trì.
- Giới thiệu Vietnix: Biết đến Vietnix là nhà cung cấp hạ tầng uy tín, giúp bạn có một nền tảng đáng tin cậy để triển khai các ứng dụng OOP của mình.
- Câu hỏi thường gặp: Được giải đáp các thắc mắc phổ biến liên quan đến abstract class.

Abstract class là gì?
Abstract class là một lớp trừu tượng trong lập trình hướng đối tượng, được dùng để làm lớp cơ sở và không thể tạo đối tượng trực tiếp từ lớp đó. Lớp này thường chứa cả phương thức trừu tượng (method không có phần thân, chỉ khai báo) và phương thức cụ thể (method đã có sẵn phần xử lý), buộc các lớp con phải override những phương thức trừu tượng khi kế thừa. Nhờ đó, abstract class giúp định nghĩa một bộ khung chung cho nhóm lớp có liên quan, vừa tái sử dụng được logic chung, vừa ép buộc các lớp con triển khai chi tiết theo nhu cầu riêng.

Ví dụ đơn giản với Java:
// Lớp trừu tượng
abstract class Shape {
// Phương thức trừu tượng: không có thân
public abstract double area();
// Phương thức cụ thể: đã có triển khai
public void printArea() {
System.out.println("Area = " + area());
}
}
// Lớp con kế thừa và bắt buộc triển khai area()
class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double area() {
return width * height;
}
}
// Hàm main minh họa
public class Main {
public static void main(String[] args) {
Shape rect = new Rectangle(5, 10);
rect.printArea(); // In ra: Area = 50.0
}
}Trong đó:
- Shape: Định nghĩa khung chung cho các hình học, trong đó area() là phương thức trừu tượng và printArea() là phương thức đã có sẵn phần triển khai.
- Rectangle: Bắt buộc phải tự triển khai logic tính diện tích trong area(), sau đó có thể gọi lại printArea() kế thừa từ lớp cha để in ra kết quả.
Cũng giống như việc xây dựng một cấu trúc code vững chắc, việc triển khai ứng dụng của bạn cũng cần một nền tảng hạ tầng mạnh mẽ. Để đảm bảo ứng dụng hoạt động mượt mà và ổn định, bạn có thể tham khảo các gói VPS tốc độ cao của Vietnix.
Đặc điểm của abstract class
Abstract class có một số đặc điểm quan trọng mà bạn cần nắm rõ trước khi sử dụng trong thiết kế hướng đối tượng, cụ thể gồm:
- Không thể khởi tạo trực tiếp: Abstract class không cho phép tạo đối tượng bằng toán tử new, bạn chỉ có thể khởi tạo thông qua các lớp con kế thừa abstract class.
- Có thể chứa cả abstract method và concrete method: Bên trong abstract class, bạn có thể khai báo phương thức trừu tượng (chỉ khai báo, không có thân) và phương thức đã triển khai để tái sử dụng logic chung cho mọi lớp con.
- Lớp con phải triển khai các abstract method: Mọi lớp con không phải abstract khi kế thừa abstract class đều bắt buộc override toàn bộ phương thức trừu tượng, nếu không thì lớp con cũng phải được đánh dấu abstract.
- Có thể có constructor, thuộc tính, static và final method: Abstract class hỗ trợ đầy đủ các thành phần như một lớp thường, giúp bạn vừa định nghĩa trạng thái (field) chung, vừa cung cấp hàm tiện ích và logic khởi tạo cho các lớp con.
- Thường dùng làm lớp cơ sở trong hệ phân cấp: Abstract class đại diện cho một khái niệm chung trong domain (ví dụ Shape, Animal, PaymentMethod), cho phép xây dựng cây kế thừa rõ ràng và buộc các lớp con tuân thủ một tập giao diện tối thiểu.

Abstract class trong Java, PHP và C#
Abstract class trong Java
Trong Java, abstract class được khai báo bằng từ khóa abstract và dùng làm lớp cha trong hệ phân cấp kế thừa. Abstract class trong Java có thể chứa cả abstract method và concrete method, cho phép vừa định nghĩa khung giao diện bắt buộc, vừa cung cấp sẵn một phần logic dùng chung cho các lớp con.
Lớp con không phải abstract khi kế thừa abstract class phải triển khai toàn bộ phương thức trừu tượng, nếu không thì lớp con cũng phải được đánh dấu abstract để tránh lỗi biên dịch. Ngoài ra, abstract class trong Java có thể có constructor, field, phương thức static, final và phù hợp cho các trường hợp cần chia sẻ trạng thái hoặc hành vi chung giữa nhiều lớp liên quan.

Abstract class trong PHP
Trong PHP, abstract class được định nghĩa bằng từ khóa abstract và phải chứa ít nhất một abstract method (phương thức chỉ khai báo, không có thân). Mục tiêu chính là buộc mọi lớp con kế thừa phải triển khai các phương thức trừu tượng, từ đó đảm bảo tất cả lớp con tuân theo một cấu trúc tối thiểu do lớp cha quy định.
Abstract class trong PHP vẫn có thể chứa phương thức thông thường, thuộc tính, constructor và cho phép chia sẻ code chung giữa các lớp con thông qua kế thừa. Khi thiết kế hệ thống PHP hướng đối tượng, abstract class thường được dùng cho các khái niệm chung như BaseController, Repository, Service, giúp chuẩn hóa giao diện làm việc giữa các phần trong ứng dụng.
Abstract class trong C#
Trong C#, abstract class cũng được khai báo bằng từ khóa abstract và dùng làm lớp cơ sở không thể khởi tạo trực tiếp. Abstract class trong C# có thể chứa cả phương thức trừu tượng lẫn phương thức đã triển khai, cho phép định nghĩa sẵn hành vi mặc định và buộc lớp con ghi đè khi cần.
Abstract class trong C# được phép có constructor, destructor, thuộc tính, sự kiện và phương thức tĩnh, nên phù hợp cho các trường hợp cần chia sẻ trạng thái và logic chung. Lớp con phải triển khai toàn bộ phương thức abstract, nếu không thì bản thân lớp con cũng phải được đánh dấu abstract. C# không hỗ trợ đa kế thừa abstract class mà chỉ hỗ trợ đa kế thừa interface, tuy nhiên abstract class vẫn có thể khai báo phương thức virtual để lớp con override linh hoạt theo nhu cầu.

So sánh abstract class và interface
Trong lập trình Java, abstract class và interface đều hỗ trợ trừu tượng hóa, cùng cho phép định nghĩa phương thức trừu tượng để ép lớp con tuân theo một hợp đồng chung. Abstract class phù hợp khi cần chia sẻ trạng thái và logic chung trong một cây kế thừa, trong khi interface phù hợp khi cần một bộ khung hành vi mà nhiều lớp khác nhau có thể triển khai, kể cả khi không liên quan về mặt kế thừa. Bảng dưới đây tổng hợp các điểm khác nhau quan trọng giữa abstract class và interface trong Java để bạn dễ đối chiếu khi thiết kế:
| Tiêu chí | Abstract class | Interface |
| Cách khai báo | Khai báo với từ khóa abstract class | Khai báo với từ khóa interface |
| Số lượng cha trên một lớp | Một lớp chỉ extends một abstract class | Một lớp có thể implements nhiều interface |
| Đa kế thừa | Không hỗ trợ đa kế thừa giữa các class | Hỗ trợ “đa kế thừa hành vi” thông qua việc implements nhiều interface |
| Constructor | Có thể định nghĩa constructor | Không có constructor |
| Kiểu phương thức | Có abstract method và method có thân | Có abstract, default, static, private method (tùy phiên bản Java) |
| Field | Có thể có instance field, static field, final hoặc non-final | Mọi field đều là public static final (hằng số) |
| Access modifier cho method | Cho phép public, protected, private | Chủ yếu public, từ Java 9+ thêm private cho method dùng nội bộ |
| Mức độ trừu tượng | Không bắt buộc trừu tượng 100%, có thể trộn logic cụ thể và logic trừu tượng | Ban đầu trừu tượng gần 100%, sau này thêm default/static/private method có triển khai |
| Kế thừa nội bộ | Có thể extends một class khác (abstract hoặc concrete) | Có thể extends một hoặc nhiều interface khác |
| Quan hệ với nhau | Abstract class có thể implements một hoặc nhiều interface | Interface không implements abstract class, chỉ được class hoặc abstract class implements |
| Trường hợp sử dụng điển hình | Dùng khi cần chia sẻ trạng thái và một phần logic chung giữa các lớp cùng nhánh kế thừa | Dùng khi cần một bộ hành vi chuẩn để nhiều lớp cùng tuân theo, kể cả lớp không cùng nhánh kế thừa |
Trường hợp sử dụng abstract class và interface
Trường hợp nên sử dụng abstract class
Khi thiết kế hệ thống hướng đối tượng, abstract class phù hợp cho các nhóm lớp có quan hệ gần nhau và cần chia sẻ cả trạng thái lẫn hành vi chung. Bạn có thể ưu tiên abstract class trong các tình huống sau:
- Các lớp con có chung dữ liệu và logic: Dùng abstract class khi nhiều lớp cần dùng chung field, constructor và một số phương thức đã triển khai, ví dụ các lớp Car, Truck kế thừa Vehicle với thuộc tính speed, weight dùng chung.
- Cần cung cấp triển khai mặc định nhưng cho phép override: Khi một số hành vi nên có bản mặc định nhưng lớp con vẫn có quyền thay đổi, abstract class cho phép vừa viết sẵn method, vừa khai báo abstract method để lớp con bắt buộc hoàn thiện phần còn lại.
- Cần kiểm soát chặt chẽ hệ phân cấp: Khi muốn xây dựng một cây kế thừa với luồng mở rộng rõ ràng, chỉ cho phép kế thừa theo một nhánh xác định, abstract class giúp quản lý cấu trúc dễ hơn so với interface.
- Cần dùng member không phải public trong hệ phân cấp: Khi cần protected field hoặc method dùng nội bộ giữa các lớp cùng nhánh kế thừa, abstract class phù hợp vì có thể lưu trữ và quản lý trạng thái chung.

Trường hợp nên sử dụng interface
Interface phù hợp khi mục tiêu chính là định nghĩa một hợp đồng hành vi mà nhiều lớp, kể cả không cùng cây kế thừa, đều phải tuân theo. Bạn nên ưu tiên interface trong các trường hợp sau:
- Nhiều lớp không liên quan cùng cần chung một bộ hành vi: Khi các lớp khác nhau đều phải triển khai cùng một nhóm phương thức, ví dụ Loggable, Serializable, Closable, interface giúp chuẩn hóa chữ ký method cho toàn hệ thống.
- Cần hỗ trợ đa kế thừa hành vi: Khi một lớp phải gánh nhiều vai trò cùng lúc như Runnable, Comparable, Observer, interface cho phép implements nhiều hợp đồng mà không bị giới hạn bởi quy tắc “mỗi lớp chỉ có một class cha”.
- Muốn tách rõ hợp đồng API khỏi phần triển khai: Khi cần thiết kế API để client lập trình dựa trên interface và không phụ thuộc implementation cụ thể, interface là lựa chọn phù hợp, giúp việc thay thế hoặc mock trong unit test dễ dàng.
- Xây dựng module linh hoạt và dễ mở rộng: Khi muốn inject nhiều implementation khác nhau cho cùng một chức năng, ví dụ nhiều loại storage hoặc nhiều nhà cung cấp thanh toán, interface giúp giảm phụ thuộc giữa các phần trong codebase.

Hạ tầng triển khai ứng dụng OOP cho abstract class và interface từ Vietnix
Khi bắt đầu áp dụng abstract class, interface và các mẫu thiết kế OOP vào dự án thực tế, bạn sẽ cần một môi trường chạy ứng dụng ổn định, dễ mở rộng. Để triển khai API Java hoặc PHP, bạn có thể tham khảo các gói VPS Vietnix với SSD NVMe, băng thông cao và tài nguyên linh hoạt, phù hợp cho cả môi trường dev, staging và production. Khi hệ thống phát triển lớn hơn, cần tài nguyên riêng biệt và hiệu năng cao hơn, dịch vụ thuê máy chủ vật lý tại Vietnix là lựa chọn nâng cấp tự nhiên cho các backend, service nội bộ hoặc hệ thống xử lý dữ liệu nặng. Đội ngũ kỹ thuật Vietnix luôn hỗ trợ bạn tối ưu cấu hình server để code OOP vận hành ổn định và tận dụng tốt tài nguyên.
Thông tin liên hệ:
- Website: https://vietnix.vn/
- Hotline: 1800 1093
- Email: sales@vietnix.com.vn
- Địa chỉ: 265 Hồng Lạc, Phường Bảy Hiền, Thành Phố Hồ Chí Minh
Câu hỏi thường gặp
Abstract là gì trong code?
Trong code, từ khóa abstract thường dùng để khai báo lớp trừu tượng (abstract class) hoặc phương thức trừu tượng (abstract method) trong các ngôn ngữ hướng đối tượng như Java, C#, PHP.
Một abstract class có bắt buộc phải có abstract method không?
Không bắt buộc, abstract class có thể không chứa abstract method nhưng vẫn được khai báo là abstract để tránh tạo instance trực tiếp và chỉ dùng để kế thừa.
Có thể dùng abstract class cho enum hoặc record không?
Trong Java, enum và record có cơ chế riêng, nếu cần trừu tượng hóa cho các loại dữ liệu này thì nên cân nhắc interface hoặc pattern khác thay vì lạm dụng abstract class.
Abstract class giúp định nghĩa khung chung và chia sẻ logic giữa các lớp có quan hệ chặt chẽ, trong khi interface tập trung vào việc mô tả hợp đồng hành vi cho nhiều lớp. Khi hiểu rõ đặc điểm, điểm khác nhau và trường hợp sử dụng của từng khái niệm, bạn có thể thiết kế kiến trúc hướng đối tượng rõ ràng, dễ bảo trì và dễ mở rộng hơn cho ứng dụng của mình.
THEO DÕI VÀ CẬP NHẬT CHỦ ĐỀ BẠN QUAN TÂM
Đăng ký ngay để nhận những thông tin mới nhất từ blog của chúng tôi. Đừng bỏ lỡ cơ hội truy cập kiến thức và tin tức hàng ngày


















