So sánh interface và lớp trừu tượng

Đây là một câu hỏi mà mình chắc chắn là có rất nhiều nhà tuyển dụng cũng như các bạn developer phân vân và chưa rõ ràng. Đây cũng là câu hỏi hay gặp khi đi phỏng vấn, và quan trọng hơn nó cũng là một trong những kiến thức cơ bản mà các bạn cần phải nắm chắc.

Nhằm giải đáp câu hỏi này, mình sẽ viết một bài tâm huyết để giúp các bạn trả lời một cách rành mạch khi đi phỏng vấn và áp dụng trong dự án của mình.

Để so sánh giữa Abstract class và Interface chúng ta cần bàn đến 2 điểm là giống nhau và khác nhau giữa chúng.

Giống nhau:

  • Abstract class và interface đều không thể khởi tạo đối tượng bên trong được.
  • Abstract class và interface đều có thể khai báo các phương thức nhưng không thực hiện chúng.
  • Abstract class và interface đều bao gồm các phương thức abstract.
  • Abstract class và interface đều được thực thi từ các class con hay còn gọi kế thừa, dẫn xuất.
  • Abstract class và interface đều có thể kế thừa từ nhiều interface.

Khác nhau:

Abstract Class

Interface

Cho phép khai báo field

Không cho phép

Các phương thức có thể có thân hàm hoặc không có thân hàm.

Chỉ khai báo không có thân hàm

Class dẫn xuất chỉ kế thừa được từ 1 abstract class và nhiều interface.

Class triển khai có thể triển khai nhiều interface.

Có chứa constructor

Không có

Các phương thức có từ khóa access modifier

Không có

Đó chính là các điểm giống và khác nhau của Abstract class và interface ở góc độ ngôn ngữ và lập trình. Còn bản chất và mục đích sử dụng khác nhau mới là phần chính chúng ta phải hiểu.

Đối với Abstract class

Abstract class giống như 1 type, tức là 1 kiểu chúng cho các class dẫn xuất, các class dẫn xuất thuộc về 1 kiểu đó, nó sẽ cung cấp các thuộc tính và hành vi chung nhất cho kiểu đó.

Ví dụ:

abstract class Person     {         protected string _name;         protected DateTime _birthDate;         protected void Say()         {             Console.Write("Person is saying....");         }         protected abstract void Work();     }     class Employee : Person     {         private float _salary;         protected override void Work()         {             throw new NotImplementedException();         }     }     class Student : Person     {         private float _mark;         protected override void Work()         {             throw new NotImplementedException();         }     }

Chúng ta có abstract class Person chứa các thông tin chung cho người như tên hay ngày sinh nhật. Còn lại các class dẫn xuất như Employee hay Student sẽ có các tính chất riêng của nó thì khai báo thêm. Còn những gì có thể dùng chung sẽ được khai báo trong Person, như vậy sẽ giảm thiểu trùng lặp code, và dễ bảo trì hơn.

Vậy chúng ta hiểu rằng mối quan hệ giữa Abstract class và derived class là mối quan hệ is-a tức là mối quan hệ thuộc về tập cha con. Nên một con chỉ thuộc về 1 cha thôi, trong đó cha quy định các gen di truyền chung nhất cho các con, các con có quyền bổ sung thêm, có quyền thể hiện hoặc không thể hiện một đặc tính hay 1 hành động của cha.

Đối với Interface

Khác với Abstract class giống một bản thiết kế của toàn class thì interface chỉ là bản thiết kế của các chi tiết method. Mối quan hệ giữa lớp thực thi và interface là mối quan hệ can-do vì đơn thuần, class triển khai interface nó phải triển khai toàn bộ method của interface đã định nghĩa. Vậy là class đó có thể làm những gì interface quy định.

Như vậy hoàn toàn 1 class có thể can-do nhiều method ở nhiều interface khác nhau, ví dụ:

interface IRunable     {         void Run();     }     interface IWorkable     {         void Work();     }     interface IEatable     {         void Eat();     }     class Person : IRunable,IWorkable, IEatable     {         protected string _name;         protected DateTime _birthDate;         public void Run()         {             Console.Write("Person runing...");         }         public void Work()         {             Console.Write("Person working...");         }         public void Eat()         {             Console.Write("Person eating...");         }     }

Chúng ta thấy cùng là con người nhưng có thể can-do tức là có thể thực hiện nhiều hành động, các interface chỉ định nghĩa tên các hành động, để các class implement triển khai chi tiết, tức triển khai interface nào có thể can-do được các hành động của interface đó.

Vậy sự khác nhau chính giữa abstract class và interface ở đây chính là mối quan hệ giữa class dẫn xuất và chúng. Đồng thời khác nhau ở mục đích sử dụng của chúng.

Chào bạn, nếu bạn là người mới tìm hiểu về lập trình Java, hẳn bạn đã từng nghe về khái niệm Abstract và Interface. Nhưng bạn có biết khi nào mình sẽ dùng abstract và khi nào mình dùng interface không? Khi mới bước chân vào nghề lập trình anh cũng rất hoang mang về công dụng và lợi ích của Abstract và Interface. Chính vì vậy anh viết bài này nhằm giúp mọi người có cái nhìn rõ hơn về sự khác nhau giữa abstract và interface. Từ đó biết lựa chọn sử dụng cái nào phù hợp nhất cho mỗi trường hợp trong lập trình Java. Đồng thời, trong bài viết anh cũng hướng dẫn cách để các bạn tạo Abstract và Interface trong lập trình Java.

1. Interface trong lập trình Java là gì

Interface chính là cách mình áp dụng tính trừu tượng trong lập trình. Interface chính là 100% abstract class (khi tạo một lớp abstract ta có thể có 5 phương thức là abstract còn lại 5 phương thức không cần abstract. Như vậy khi lớp con kế thừa thì bắt buộc cài đặt 5 phương thức còn 5 phương thức kia không cần cài đặt. Nếu một lớp abstract có 10 phương thức abstract thì bắt buộc lớp con phải cài đặt 10 phương thức, như vậy là cũng giống interface khi ta có 10 phương thức thì lớp con cũng phải cài đặt 10 phương thức. Nói các khác interface chính là abstract class nếu lớp abstract class đó tất cả các method đều là abstract method) để nhóm các phương thức liên quan với nhau và không có phần thân. Phần thân của method sẽ được implement (cài đặt) ở trong lớp implement Interface.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

// Interface interface Animal { public void animalSound(); // method của Interface không có phần thân public void sleep(); //method của Interface không có phần thân } // Pig "implements" Interface Animal class Pig implements Animal { public void animalSound() {

// phần thân của interface sẽ được code  trong class PI
System.out.println("The pig says: wee wee");
} public void sleep() {
// phần thân của interface sẽ được code trong class PIG
System.out.println("Zzz");
} }

Một số chú ý khi sử dụng Interface.

  • Cũng giống như Abstract Class. Chúng ta không thể tạo đối tượng từ Interface bằng toán tử new
  • Interface thì chứa method trống không có phần thân. Phần thân sẽ được code bởi những class implement (cài đặt) interface đó
  • Lớp cài đặt Interface phải implement hết tất cả các method có trong interface. Nó định nghĩa một mẫu chung các hành động mà các lớp implements nó follow theo.
  • Các method trong Interface mặc định là abstract public và
  • Các biến (thuộc tính) trong Interface mặc định là public,static và final
  • Các lớp có thể cài đặt (implements) một hoặc nhiều Interface.
  • Interface thì không có constructor chính vì vậy mà ta không thể tạo object của một Interface được

2. Abstract trong lập trình Java là gì

Data Abstraction là quá trình che giấu đi những dữ liệu quan trọng mình chỉ đưa ra những thông tin cần thiết cho người dùng. Để làm được abstraction trong lập trình, ta có thể sử dụng abstract và interface. Ta có thể sử dụng abstract cho class hoặc method. Chúng ta sử dụng từ khoá abstract để khai báo abstract class và method.

  • Abstract class : cũng giống như Interface chúng ta không thể tạo đối tượng từ Abstract Class
  • Abstract method : cũng giống như Interface chúng không có phần thân . Phần thân sẽ được cài đặt trong lớp kế thừa nó

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

// Abstract class abstract class Animal { // abstract class không có phần public abstract void animalSound(); // abstract class không có phần thân public void sleep() {

System.out.println("Zzz");
} } class Pig extends Animal { public void animalSound() {
// phần code thực thi của abstract method được viết bới lớp con kế thừa nó
System.out.println("The pig says: wee wee");
} }

3. Sự khác nhau giữa abstract và interface

Bảng dưới đây sẽ giúp các em có cái nhìn rõ hơn về sự khác nhau giữa abstract và interface. Khi nào thì chúng ta nên sử dụng abstract hoặc interface cho hợp lý