Hôm bữa thấy nhiều bạn hỏi vấn đề này, mỗi người lại đưa ra một giải thích khác nhau, nhưng để có thể hiểu được lý do tại sao lại cần đến interface chúng ta sẽ cần nhìn sâu vào vào bên trong lập trình hướng đối tượng.

Vấn đề đa thừa kế

Có nhiều bạn hiểu rằng interface ra đời để giải quyết vấn đề đa thừa kế vì java không hỗ trợ đa thừa kế, ví dụ viết thế này thì được:

class A extends B {}

Nhưng viết thế này thì không được:

class A extends B, C {}

Buộc phải sử dụng intertface để có thể viết kiểu đa thừa kế thế này:

class A extends B implements C, D, E, F {}

Sự hiểu này là đúng, nhưng bạn lại chưa hiểu được tại sao java lại chỉ cho phép duy nhất một thừa kế. Nguyên nhân của việc này cá nhân mình nghĩ đó là do các hàm final. Ví dụ bạn có hai lớp B, C để có chung một hàm final hello thế này:

class B {
   public final void hello() {}
}

class C {
   public final void hello() {}
}

Bây giờ bạn cho phép A thừa kế cả B, C thì trình biên dịch sẽ không biết phải chọn phương thức nào dẫn đến báo lỗi, hàm final cũng không thể nào ghi đè được.
Như vậy về bản chất thì sự xuất hiện của interface là do đặc tính của từng ngôn ngữ và trình dịch đi kèm theo nó, ví dụ như Java không hỗ trợ đa thừa kế có thể là do trình biên dịch không biết làm thế nào trong trường hợp hàm final. Tuy nhiên nếu java viết lại trình biên dịch cho phép đa thừa kế, trong trường hợp hàm final thì chọn hàm đầu tiên trong danh sách thì interface lại không cần thiết nữa.
Trên thực tế từ java 8 trở đi thì đã cho phép hàm mặc định trong interface rồi, nên interface cũng gần trở nên giống class hơn một chút.

Sự phân biệt

Sự ra đời của interface còn có một ý nghĩa nữa dùng để phân biệt. Nếu chỉ có class thì chúng ta gặp những vấn đề kiểu thế này:

abstract class B {
    public void hello() {
        world();
    }
    
    public abstract void world();
}

class A extends B {
    @Override
    public void world() {}
}

Khi chúng ta lấy A thừa kế B chúng ta sẽ không biết liệu trong B có những phương thức nào hay chỉ có các phương thức mà chúng cần cài đặt thôi, chúng ta lại phải đọc tài liệu hoặc truy cập sâu vào mã nguồn của lớp B để xem, mặc dù không mất thời gian mấy nhưng cũng có sự bất tiện nhất định. Nếu chúng ta khai báo interface thì mặc định các hàm sẽ là cần cài đặt, nghĩa là có sự phân biệt rằng dùng class là mặc định sẽ chứa ít nhất một hàm đã được cài đặt, còn interface mặc định là chưa có hàm nào được cài đặt cả.
Tuy nhiên như đã nói ở trên từ java 8 trở đi thì interface đã có hàm default nên không phải tất cả các hàm của interface cần cài đặt nên sự phân biệt cũng không còn quá đáng kể.

Tổng kết

Như vậy chúng ta đã cùng nhau tìm hiểu lý do tại sao lại cần phải có interface. Trên thực tế thì nó tuỳ ngôn ngữ, việc có interface hay không cũng không phải vấn đề nếu ngôn ngữ hoặc trình dịch ngôn ngữ đó chấp nhận rằng chỉ có class.
Cám ơn bạn đã quan tâm đến bài viết|video này. Để nhận được thêm các kiến thức bổ ích bạn có thể:

  1. Đọc các bài viết của TechMaster trên facebook: https://www.facebook.com/techmastervn.
  2. Xem các video của TechMaster qua Youtube: https://www.youtube.com/@TechMasterVietnam nếu bạn thấy video/bài viết hay bạn có thể theo dõi kênh của TechMaster để nhận được thông báo về các video mới nhất nhé.
  3. Chat với techmaster qua Discord: https://discord.gg/yQjRTFXb7a