Object Oriented Programming

Sự khác biệt giữa abstract và interface?

Nếu bạn là lập trình viên thì chắc chắn bạn phải biết đến OOP (Object Oriented Programming – lập trình hướng đối tượng). Và câu hỏi mà mình sẽ trả lời trong bài viết này chắc chắn đã/đang hoặc sẽ là câu hỏi dành cho bạn.

  1. Khái niệm

Abstract class là một class cha cho tất cả các class có cùng bản chất. Bản chất ở đây được hiểu là kiểu, loại, nhiệm vụ của class.

Interface là một cách thức hoạt động mà bạn có thể thêm vào bất kì class nào. Các class này có thể có cùng bản chất hoặc không. Cách thức hoạt động ở đây không đồng nghĩa với phương thức (hoặc hàm).

  1. Sự khác biệt
  • Abstract class có đầy đủ tính chất của một class, ngoại trừ việc nó không cho phép tạo instance, nghĩa là sẽ không thể khởi tạo được các đối tượng thuộc một abstract class. Interface không phải là class.
  • Abstract class không cho phép đa kế thừa (multiple inheritance), nghĩa là một sub-class chỉ có thể extends một class/abstract class. Interface cho phép đa kế thừa, nghĩa là một sub-class có thể implements nhiều interface để bổ sung cách thức hoạt động của chính nó.
  • Abstract class có thể implements interface, nhưng interface không thể extends abstract class.
  • Cả 2 đều là “bản thiết kế” cho các lớp dẫn xuất, do đó chúng chỉ chứa các khai báo properties và method mà không quan tâm bên trong thực hiện những gì. Nhưng abstract class là “bản thiết kế” cho class còn interface là “bản thiết kế” cho method.
  • Abstract class có thể chứa các method đã được implement, interface thì không.
  • Toàn bộ những method và properties trong interface không cần khai báo access modifier vì mặc định là public. Abstract class thì phải bắt buộc khai báo (public, protected) và bắt buộc có từ khóa abstract trong các method và properties được khai báo trừu tượng.
  • Method của abstract class có thể sử dụng những access modifiers như private, protected, default, public, static nhưng method của interface chỉ sử dụng public và asbtract.
  • Class implements interface bắt buộc phải implement toàn bộ những method và properties đã khai báo trong interface. Class extends abstract class chỉ bắt buộc implement những abstract method (trừ khi nó cũng là abstract class)

3. Nên dùng cái nào cho đúng?

Abstract class

  • Bạn muốn chia sẻ mã các class có quan hệ chặt chẽ với nhau.
  • Bạn muốn các class con của abstract class có cùng các properties hoặc method, hoặc bạn muốn thay đổi access modifier (thay vì mặc định là public).
  • Bạn muốn khai báo non-static hoặc non-final fields. Mục đích là để định nghĩa những method có thể truy cập và thay đổi trạng thái của của các đối tượng mà nó thuộc về

Interface

  • Bạn muốn các class khác nhau về bản chất nhưng có cùng cách thức hoạt động.
  • Bạn muốn chỉ định hành vi của một kiểu dữ liệu cụ thể, nhưng không quan tâm đến ai thực hiện hành vi của nó.
  • Bạn cần đa kế thừa.

Bài viết có tham khảo các nguồn: