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

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.

 

Abstract class, Java, PHP, C#, interface

 

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ư:

 

  • Constructor.

 

  • Thuộc tính.

 

  • Static method.

 

  • Final method.

 

  • Protected member.

 

Đ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ư:

 

  • Animal.

 

  • Shape.

 

  • Vehicle.

 

  • PaymentMethod.

 

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, Java, PHP, C#, interface

 

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ể:

 

  • Chứa abstract method.

 

  • Chứa concrete method.

 

  • Có constructor.

 

  • Có field.

 

  • Có static method.

 

  • Có final method.

 

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, Java, PHP, C#, interface

 

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:

 

  • Chia sẻ logic chung.

 

  • Tái sử dụng code.

 

  • 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:

 

  • BaseController.

 

  • BaseRepository.

 

  • Service.

 

  • AbstractModel.

 

Đ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ợ:

 

  • Abstract method.

 

  • Virtual method.

 

  • Constructor.

 

  • Destructor.

 

  • Property.

 

  • Event.

 

  • Static member.

 

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) Hạn chế
Concrete method Có thể có (tùy ngôn ngữ)
Abstract method
Đa kế thừa Không
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ụ:

 

  • Vehicle → Car, Truck.

 

  • Animal → Dog, Cat.

 

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ụ:

 

  • Serializable.

 

  • Runnable.

 

  • Loggable.

 

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.

 HỖ TRỢ TRỰC TUYẾN