Hiện nay mặc dù OOP (Object Oriented Programming) đã rất phổ biến nhưng đối với những bạn mới tiếp cận lập trình hướng đối tượng thì vẫn còn khá mơ hồ trong việc phân biệt hai khái niệm Interface và Abstract class. Vì vậy, bài viết này chúng ta sẽ tìm hiểu kỹ hơn về sự giống và khác nhau giữa hai khái niệm này và biết được khi nào nên dùng interface, khi nào nên dùng abstract class nhé.
– Trước khi đọc tiếp nội dung bên dưới, các bạn có thể xem lại bài viết chi tiết về abstract class và interface để có cái nhìn tổng quát về 2 khái niệm này:
– Nội dung bài viết sẽ trình bày các phần sau:
- Sự giống nhau của Abstract class và Interface
- Sự khác nhau giữa Abstract class và Interface
- Khi nào dùng Abstract class? Khi nào dùng Interface?
1. Sự giống nhau của Abstract class và Interface
- Abstract class và interface đều không thể khởi tạo đối tượng từ chính nó được.
- Abstract class và interface đều có chứa abstract method. Trong interface không khai báo với từ khóa abstract, nhưng bản chất của các phương thức trong interface là abstract method.
- Abstract class và interface đều được kế thừa hoặc thực thi phương thức hoặc properties từ các class dẫn xuất nó.
- Abstract class và interface đều có thể implement từ một hoặc nhiều interface.
- Abstract class và interface đều giúp cho code trở nên sáng sủa và gọn gàng, dễ bảo trì và nâng cấp.
2. Sự khác nhau giữa Abstract class và Interface
Abstract class | Interface |
– Có thể tạo được đối tượng thông qua lớp dẫn xuất.(Xem lại bài: Lớp trừu tượng Abstract class trong C#) | – Không thể tạo được đối tượng từ nó hoặc từ lớp dẫn xuất. |
– Vừa có thể kế thừa class, vừa có thể hiện thực interface. (Trong trường hợp này, tên base class phải để đầu tiên trong danh sách, tiếp theo là tên của các interface) | – Không thể kế thừa class, chỉ có thể hiện thực interface. |
– Có thể khai báo field, const, constructor, destructor. | – Không được khai báo field, const, constructor, destructor. |
– Có thể chứa phương thức đã định nghĩa hoàn chỉnh. | – Không được chứa phương thức định nghĩa, chỉ khai báo prototype(nguyên mẫu hàm) của phương thức. |
– Ở lớp dẫn xuất khi kế thừa phải dùng từ khóa override lúc định nghĩa. | – Không dùng từ khóa override khi implement (vì định nghĩa mới hoàn toàn). |
– Được phép chỉ định access modifiers cho phương thức, thuộc tính… như public, protected, private. Đối với các methods hay properties trừu tượng bắt buộc khai báo với từ khóa abstract và access modifiers bắt buộc là public hoặc protected. | – Không được phép chỉ định access modifiers cho phương thức, thuộc tính. Tất cả giả định là public và không thể thay đổi thành access modifiers khác. |
– Chỉ dùng để định nghĩa cốt lõi của một lớp và chỉ sử dụng cho những đối tượng có cùng bản chất. | – Dùng để định nghĩa những khả năng bên ngoài của một lớp. Tức là những đối tượng không cùng bản chất với interface, cũng implement được. |
3. Khi nào dùng Abstract class? Khi nào dùng Interface?
#1. Khi nào dùng Abstract class?
– Sử dụng abstract class khi chúng ta muốn xây dựng một lớp là lớp cha cho các lớp con có cùng bản chất (kiểu, loại, nhiệm vụ lớp), mang tính huyết thống → kế thừa thuộc tính và phương thức của nó.
– Và bên trong abstract class sẽ vừa có phương thức đã hoàn thiện-đã định nghĩa hoàn chỉnh (phương thức thường, hoặc phương thức đi kèm với từ khóa virtual), vừa có phương thức chưa hoàn thiện-chưa định nghĩa (phương thức đi kèm với từ khóa abstract).
– Các phương thức chưa hoàn thiện sẽ được sử dụng cho nhiều đối tượng có cùng bản chất, và mỗi đối tượng sẽ tự định nghĩa để thực hiện theo mỗi cách khác nhau phù hợp với đối tượng đó. Ví dụ lớp abstract class DongVat, có abstract method là Ăn() thì các động vật khác như Chim, Cá, Mèo,… có cách ăn là khác nhau, do đó khi kế thừa sẽ định nghĩa lại cho phù hợp.
#2. Khi nào dùng Interface?
– Sử dụng interface khi chúng ta muốn “đa kế thừa”.
– Khi muốn áp dụng một số hành động cho nhiều class khác nhau, các class này có thể cùng hoặc khác bản chất. Và khi implement interface, các lớp này cần phải định nghĩa lại các quy tắc mà chúng ta đã đề ra trong interface.
– Khi muốn xây dựng mới hoàn toàn, chỉ bao gồm các thành phần chưa hoàn thiện-chưa được định nghĩa.