Những điểm chính
-
Hiểu rõ abstract class là gì và vai trò của nó trong lập trình hướng đối tượng.
-
Nắm được các đặc điểm quan trọng của abstract class.
-
Biết cách abstract class hoạt động trong Java, PHP và C#.
-
Phân biệt được abstract class và interface.
-
Hiểu khi nào nên sử dụng abstract class và khi nào nên dùng interface.
Abstract class là gì?
Abstract class là lớp trừu tượng dùng làm lớp cha trong lập trình hướng đối tượng và không thể tạo đối tượng trực tiếp từ lớp này. Abstract class thường chứa:
-
Abstract method: Phương thức chỉ khai báo nhưng không có phần thân.
-
Concrete method: Phương thức đã có sẵn phần triển khai.
Các lớp con khi kế thừa abstract class sẽ bắt buộc phải triển khai các abstract method. Điều này giúp xây dựng một bộ khung chung cho nhiều lớp có liên quan, đồng thời vẫn cho phép mỗi lớp con tùy chỉnh logic riêng.

Trong ví dụ:
-
Shape: Là abstract class định nghĩa khung chung cho các hình học.
-
area(): Là phương thức trừu tượng dùng để tính diện tích.
-
printArea(): Là phương thức đã được triển khai sẵn.
-
Rectangle: Là lớp con phải override phương thức area() để tự xử lý logic tính diện tích.
Đặc điểm của abstract class
Abstract class có nhiều đặc điểm quan trọng trong thiết kế hệ thống hướng đối tượng.
Không thể khởi tạo trực tiếp
Bạn không thể dùng toán tử new để tạo object trực tiếp từ abstract class mà chỉ có thể khởi tạo thông qua các lớp kế thừa.
Có thể chứa abstract method và concrete method
Abstract class vừa cho phép khai báo phương thức trừu tượng, vừa cho phép viết sẵn logic xử lý dùng chung cho toàn bộ lớp con.
Lớp con bắt buộc triển khai abstract method
Nếu lớp con không triển khai đầy đủ các abstract method thì bản thân lớp con cũng phải được khai báo là abstract.
Có thể chứa constructor, field và static method
Abstract class hỗ trợ gần như đầy đủ tính năng của một class thông thường như:
Điều này giúp tái sử dụng trạng thái và logic chung hiệu quả hơn.
Thường dùng làm lớp cơ sở
Abstract class thường đại diện cho một khái niệm tổng quát trong hệ thống như:
Các lớp con sẽ kế thừa và triển khai chi tiết riêng theo từng loại.

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à thường được sử dụng làm lớp cha trong cây kế thừa.
Abstract class trong Java có thể:
Lớp con bắt buộc phải override toàn bộ abstract method nếu không muốn bị đánh dấu abstract.
Abstract class trong Java phù hợp khi nhiều lớp cần dùng chung trạng thái và hành vi.

Abstract class trong PHP
Trong PHP, abstract class cũng được khai báo bằng từ khóa abstract và phải có ít nhất một abstract method.
Abstract class trong PHP cho phép:
-
Chuẩn hóa cấu trúc giữa các lớp con.
Trong các dự án PHP, abstract class thường được dùng để xây dựng:
Điều này giúp hệ thống dễ quản lý và đồng bộ hơn.
Abstract class trong C#
Trong C#, abstract class cũng đóng vai trò là lớp cơ sở không thể khởi tạo trực tiếp.
Abstract class trong C# hỗ trợ:
Lớp con phải triển khai toàn bộ phương thức abstract nếu không muốn tiếp tục là abstract class.
C# không hỗ trợ đa kế thừa class nhưng vẫn cho phép kết hợp abstract class với interface để mở rộng khả năng thiết kế hệ thống.
So sánh abstract class và interface
Abstract class và interface đều hỗ trợ tính trừu tượng trong lập trình hướng đối tượng, tuy nhiên chúng có mục đích sử dụng khác nhau.
|
Tiêu chí |
Abstract class |
Interface |
|
Khởi tạo object |
Không |
Không |
|
Constructor |
Có hỗ trợ |
Không |
|
Thuộc tính (field) |
Có |
Hạn chế |
|
Concrete method |
Có |
Có thể có (tùy ngôn ngữ) |
|
Abstract method |
Có |
Có |
|
Đa kế thừa |
Không |
Có |
|
Mục đích chính |
Chia sẻ logic và trạng thái |
Định nghĩa hành vi |
|
Quan hệ giữa các lớp |
Có liên quan chặt chẽ |
Có thể không liên quan |
|
Access modifier |
Đầy đủ |
Chủ yếu public |
|
Trường hợp phù hợp |
Base class |
Hợp đồng hành vi |
Trường hợp nên sử dụng abstract class
Abstract class phù hợp khi các lớp có quan hệ gần nhau và cần chia sẻ logic hoặc trạng thái chung.
Các lớp có chung dữ liệu và hành vi
Ví dụ:
Các lớp này thường dùng chung field và method.
Cần cung cấp logic mặc định
Bạn có thể viết sẵn một phần logic trong abstract class để lớp con tái sử dụng và chỉ override khi cần.
Muốn kiểm soát hệ phân cấp
Abstract class giúp xây dựng cây kế thừa rõ ràng và kiểm soát cấu trúc hệ thống tốt hơn.
Cần sử dụng protected member
Abstract class hỗ trợ protected field và protected method để các lớp con dùng nội bộ.
Trường hợp nên sử dụng interface
Interface phù hợp khi mục tiêu là định nghĩa hành vi chung cho nhiều lớp khác nhau.
Nhiều lớp cần chung một hành vi
Ví dụ:
Các lớp có thể không liên quan nhưng vẫn cần triển khai cùng một nhóm method.
Cần đa kế thừa hành vi
Một lớp có thể implements nhiều interface cùng lúc để đảm nhận nhiều vai trò khác nhau.
Tách hợp đồng và implementation
Interface giúp client làm việc thông qua abstraction thay vì phụ thuộc trực tiếp vào implementation cụ thể.
Dễ mở rộng và test
Interface giúp:
-
Mock dễ hơn khi unit test.
-
Thay đổi implementation linh hoạt.
-
Giảm phụ thuộc giữa các module.
Điều này rất quan trọng trong các hệ thống lớn hoặc kiến trúc clean architecture.