Một trong những câu hỏi thường gặp nhất khi học OOP là: (Virtual) abstract class và Interface khác nhau chỗ nào? Và khi nào sử dụng cái nào?
Câu trả lời đơn giản nhất là: Nếu ngôn ngữ của bạn có hỗ trợ interface thì hãy dùng nó, đừng nghĩ gì về abstract class nữa.Để hiểu hơn về 2 thứ này, ta cần hiểu một chút về trừu tượng trong (abstraction) OOP.
Trong thiết kế, tính trừu tượng luôn là một ưu tiên hàng đầu, một trong những nguyên tắc thiết kế là áp dụng trừu tượng nhiều nhất có thể, bởi các lợi ích sau:
– Giảm độ phụ thuộc giữa các thành phần, đặc biệt là các thành phần đang được phát triển hoặc thay đổi thường xuyên. Độ phụ thuộc thấp, các lỗi xảy ra sẽ ít ảnh hưởng dây chuyền tới các thành phần khác.
– Dễ dàng thay đổi và mở rộng về sau: khi thiết kế bạn luôn phải tâm niệm là chương trình phải dễ dàng cập nhật, thay đổi, sửa lỗi sau nhiều năm, có thể là 5 năm, 10 năm hoặc thậm chí 20 năm. Bạn phải đảm bảo chi phí để thêm một tính năng mới trong tương lai sẽ tương đương với hiện tại, chứ không phải càng ngày càng tăng lên. Các thành phần mới thêm vào thậm chí không khiến bạn phải biên dịch hoặc triển khai lại các phần đã có.
Trong thời kỳ đầu của OOP, người ta sử dụng thừa kế như một cách để hiện thực tính trừu tượng, lớp cha khai báo các phương thức, lớp con hiện thực hóa các phương thức đó theo cách riêng của chúng. Nhưng nhiều nhà thiết kế tin rằng như vậy vẫn chưa đủ, bởi một lớp thì vẫn là một lớp, nó vẫn mô tả một thực thể nào đó, ngay cả khi nó là lớp abstract. Từ đó interface xuất hiện, interface không được coi là một thực thể, mà chỉ đơn thuần là một bản khai báo, một danh mục các hành vi cần thiết. Hãy thử tìm một cuốn sách về OOP cách đây vài chục năm, các bạn sẽ không tìm thấy chỗ nào nói về interface, thậm chí không có một chương riêng cho abstraction, bởi đơn giản abstraction khi đó vẫn chỉ được nói đến như một phần của polymorphism và inheritance.
Có thể nhìn từ góc độ lập trình bạn không thấy nhiều thay đổi, nhưng từ góc độ thiết kế, interface đại diện cho pattern (hình mẫu) interface/implementation thay vì mô hình thừa kế sử dụng các lớp. Mô hình interface/implementation rộng hơn và khái quát hơn mô hình thừa kế.Tới đây bạn đã thấy sự khác nhau giữa hai cái chưa? Nếu chưa có nghĩa là suy nghĩ của bạn vẫn bị gắn chặt với một ngôn ngữ nào đó cụ thể, hãy thử học thêm một nền tảng/ngôn ngữ mới, hay thử thiết kế một hệ thống nào đó xem sao?Nếu các bạn gửi yêu cầu và thiết kế của các bạn cho tôi, tôi có thể xem và đánh giá giúp các bạn.