Abstract Class là gì? Phân biệt Abstract Class và Interface trong lập trình

Nội dung chính cần nắm

 

  • Khái niệm và ví dụ: Abstract class đóng vai trò là lớp cơ sở, định nghĩa một bộ khung chung cho các lớp con kế thừa.

 

  • Đặc điểm quan trọng: Không thể khởi tạo trực tiếp và các lớp con phải triển khai những phương thức trừu tượng.

 

  • Ứ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#.

 

  • So sánh với interface: Phân biệt sự khác nhau về đa kế thừa, constructor và loại thành viên.

 

  • Tiêu chí lựa chọn: Khi nào nên dùng abstract class và khi nào nên dùng interface để thiết kế hệ thống linh hoạt và dễ bảo trì.

 

Khái niệm về Abstract Class

 

Abstract class là một lớp trừu tượng trong lập trình hướng đối tượng, được sử dụng làm lớp cơ sởkhông thể tạo đối tượng trực tiếp từ lớp đó.

 

Lớp này có thể chứa cả abstract method (phương thức chỉ khai báo, không có thân) và concrete method (phương thức đã có phần xử lý). Khi một lớp kế thừa abstract class, nó phải override các abstract method để triển khai chi tiết.

 

Nhờ vậy, abstract class giúp:

 

  • Định nghĩa một bộ khung chung cho các lớp liên quan.

 

  • Tái sử dụng logic đã có sẵn.

 

  • Buộc các lớp con phải triển khai hành vi cụ thể theo yêu cầu.

 

Abstract Class, Interface, Phân biệt Abstract Class và Interface

 

Các đặc trưng của Abstract Class

 

Abstract class có một số đặc điểm quan trọng cần hiểu rõ khi thiết kế hệ thống hướng đối tượng:

 

  • Không thể khởi tạo trực tiếp: Không thể tạo object bằng toán tử new từ abstract class, chỉ có thể tạo thông qua lớp con kế thừa.

 

  • Có thể chứa cả abstract method và concrete method: Abstract class vừa định nghĩa phương thức trừu tượng, vừa cung cấp sẵn logic chung cho các lớp con.

 

  • Lớp con phải triển khai abstract method: Nếu lớp con không override các phương thức trừu tượng thì bản thân lớp đó cũng phải được khai báo là abstract.

 

  • Có thể chứa constructor và thuộc tính: Abstract class vẫn có thể có constructor, field, phương thức static hoặc final giống như lớp bình thường.

 

  • Thường dùng làm lớp cơ sở: Abstract class đại diện cho một khái niệm chung trong hệ thống, ví dụ như Shape, Animal, PaymentMethod.

 

Abstract Class, Interface, Phân biệt Abstract Class và Interface

 

Cách Abstract Class hoạt động trong các ngôn ngữ lập trình

 

Abstract Class trong Java

 

Trong Java, abstract class được khai báo bằng từ khóa abstract và thường dùng làm lớp cha trong hệ thống kế thừa.

 

Một abstract class trong Java có thể:

 

  • Chứa abstract methodconcrete method.

 

  • constructor, field, static methodfinal method.

 

  • Cho phép chia sẻ logic chung giữa nhiều lớp con.

 

Lớp con khi kế thừa phải triển khai toàn bộ phương thức trừu tượng. Nếu không, lớp con cũng phải được đánh dấu là abstract để tránh lỗi biên dịch.

 

Abstract Class, Interface, Phân biệt Abstract Class và Interface

 

Abstract Class trong PHP

 

Trong PHP, abstract class được khai báo bằng từ khóa abstract. Thông thường nó sẽ chứa ít nhất một abstract method để buộc các lớp con phải triển khai.

 

Abstract class trong PHP vẫn có thể:

 

  • Chứa phương thức bình thường.

 

  • Có thuộc tính và constructor.

 

  • Chia sẻ code chung cho các lớp con.

 

Trong thực tế, abstract class thường được dùng cho các lớp cơ sở như:

 

  • BaseController

 

  • Repository

 

  • Service

 

Những lớp này giúp chuẩn hóa cấu trúc và cách hoạt động của hệ thống.

 

Abstract Class trong C#

 

Trong C#, abstract class cũng được khai báo bằng từ khóa abstract và không thể khởi tạo trực tiếp.

 

Abstract class trong C# có thể chứa:

 

  • Abstract method

 

  • Method đã triển khai

 

  • Constructor và destructor

 

  • Thuộc tính và sự kiện

 

  • Phương thức static

 

C# không hỗ trợ đa kế thừa class, nhưng cho phép một abstract class khai báo virtual method để lớp con có thể override khi cần.

 

Abstract Class, Interface, Phân biệt Abstract Class và Interface

 

So sánh Abstract Class và Interface

 

Trong Java, abstract class và interface đều được dùng để trừu tượng hóa trong thiết kế hướng đối tượng. Tuy nhiên mục đích và cách sử dụng của chúng có sự khác biệt.

 

Tiêu chí Abstract Class Interface
Cách khai báo abstract class interface
Số lớp cha Chỉ kế thừa được 1 class Có thể implements nhiều interface
Đa kế thừa Không hỗ trợ đa kế thừa class Hỗ trợ đa kế thừa hành vi
Constructor Có thể có constructor Không có constructor
Kiểu phương thức Có abstract và method có thân Có abstract, default, static, private method
Field Có thể có field bình thường Tất cả field là public static final
Access modifier public, protected, private Chủ yếu public
Mức độ trừu tượng Không bắt buộc 100% trừu tượng Gần như hoàn toàn trừu tượng
Kế thừa nội bộ Có thể extends class khác Có thể extends nhiều interface
Quan hệ Có thể implements interface Interface chỉ được class implements

 

Khi nào nên dùng Abstract Class và Interface

 

Trường hợp nên dùng Abstract Class

 

Abstract class phù hợp khi các lớp con có mối quan hệ chặt chẽ và cần chia sẻ trạng thái hoặc logic chung.

 

Một số tình huống phổ biến:

 

  • Các lớp có chung dữ liệu và hành vi:
    Ví dụ CarTruck kế thừa từ Vehicle với các thuộc tính chung như speed, weight.

 

  • Cần triển khai logic mặc định:
    Abstract class cho phép cung cấp method mặc định nhưng vẫn cho phép lớp con override.

 

  • Kiểm soát hệ phân cấp kế thừa:
    Giúp thiết kế cấu trúc lớp rõ ràng và dễ quản lý.

 

  • Cần dùng protected member:
    Cho phép các lớp con truy cập và sử dụng chung dữ liệu nội bộ.

 

Trường hợp nên dùng Interface

 

Interface phù hợp khi cần định nghĩa một hợp đồng hành vi chung cho nhiều lớp, kể cả khi chúng không liên quan về mặt kế thừa.

 

Một số trường hợp điển hình:

 

  • Nhiều lớp khác nhau cần cùng hành vi:
    Ví dụ Serializable, Runnable, Comparable.

 

  • Cần đa kế thừa hành vi:
    Một lớp có thể implements nhiều interface để đảm nhận nhiều vai trò.

 

  • Tách API khỏi implementation:
    Client chỉ làm việc với interface thay vì lớp cụ thể.

 

  • Thiết kế hệ thống linh hoạt:
    Interface giúp thay thế implementation dễ dàng và thuận tiện cho unit testing.

 HỖ TRỢ TRỰC TUYẾN