Rss

19 thg 9, 2015

OOP – Interface vs Abstract class

Sự khác nhau giữa Abstract Class và Interface trong Java?

Đây là một câu hỏi khá thú vị với vị trí junior java developer mà bất kì nhà tuyển dụng- NTD nào cũng đưa ra trong buổi phỏng vấn

Sự khác nhau giữa Abstract Class và Interface trong Java?

Abstract class và interface là một trong những phần core của ngôn ngữ lập trình Java và việc lựa chọn giữa asbtract class và interface trong thiết kế hệ thống là quyết đinh của một người - một team thiết kế hệ thống.

Hiện nay mặc dù OOP (Object Oriented Programming) đã rất phổ biến nhưng đa số vẫn còn khá mơ hồ trong việc phân biệt và định nghĩa hai khái niệm lớp Interface và Abstract. Bài viết này chúng ta sẽ tìm hiểu kỹ hơn về khái niệm và sự khác biệt giữa chúng, lưu ý ở đây là Abstract Class chứ không phải là Abstract Method nhé!

What is an Abstract Class?

Lớp trừu tượng đơn giản được xem như một class cha cho tất cả các Class có cùng bản chất. Do đó mỗi lớp dẫn xuất (lớp con) chỉ có thể kế thừa từ một lớp trừu tượng. Bên cạnh đó nó không cho phép tạo instance, nghĩa là sẽ không thể tạo được các đối tượng thuộc lớp đó.

What is an Interface?

Lớp này được xem như một mặt nạ cho tất cả các Class cùng cách thức hoạt động nhưng có thể khác nhau về bản chất. Từ đó lớp dẫn xuất có thể kế thừa từ nhiều lớp Interface để bổ sung đầy đủ cách thức hoạt động của mình (đa kế thừa - Multiple inheritance).

Và sự khác biệt giữa abstract class và interface được liệt kê như sau:

  • "abstract" là từ khóa được sử dụng để tạo ra một abstract class, nó cũng có thể được sử dụng cho method. "interface" là từ khóa để tạo ra một và nó không thể sử dụng cho method. 
  • Subclasses sử dụng từ khóa "extends" để extend một abstract class và chúng cần phải implementation tất cả các method được khai báo trong abstract class ( trừ khi subclass cũng là abstract class). Với interface, một class sẽ sử dụng từ khóa "implements" để implement những interface. Việc implement những method trong interface là không bắt buộc. 
  • Abstract class có thể có nhiều method đã được implementation, trong khi interface chỉ define ra những abstract method (không thực hiện implementation). 
  • Abstract class có thể có những contractor, trong khi interface không có bất kỳ một contractor nào. 
  • Abstract class có tất cả tính năng của một java class bình thường, ngoại trừ việc instantiate nó. Interface chỉ được phép khai báo method và public static final constants. 
  • 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. 
  • Một subclass chỉ có thể extend duy nhất một abstract class nhưng một class có thể implement nhiều interface. 
  • Những abstract class có thể extend abstract class khác và implement nhiều interface, nhưng một interface chỉ có thể extend nhiều interface. 
  • Có thể thực hiện run một abstract class nếu nó có một main() method, ngược với interface thì không. 
  • Interfaces được sử dụng để define contract cho những class implement, abstract class cũng thực hiện define contract nhưng nó cung cấp một cách thức implementations có săn để subclass sử dụng. 
  • Việc lựa chọn giữa abstract class và interface là một quyết định phụ thuộc vào nhiều yếu tố. Bạn hãy xem khi nào sử dụng asbtract class và khi nào sử dụng interface là giải pháp tốt nhất. Tôi xin đưa ra vài điều dưới đây: 
  • Java không hỗ trợ "multiple class level inheritance", do đó, mọi class chỉ có thể có một super class. Nhưng một class lại có thể implement nhiều interface. Do vậy, trong hầu hết các trường hợp, interface là một sự lựa chọn đúng đắn cho việc cung cấp base contract cho class hierarchy. 
  • Nếu có nhiều method trong contract, thì bạn nên sử dụng abstract class vì nó cung cấp sẵn implementation cho một vài common method được áp dụng cho tất cả các subclasses. 
  • Nếu contract của bạn thay đổi liên tục thì sử dụng interface có thể gặp những vấn đề bởi vì nó không thể thêm những method trong interface mà không thay đổi ở phía class thực hiện implement nó. Với abstract thì bạn không cần lo lắng điều này, do đó trong tình huống này thì sử dụng abstract là một giải pháp hiệu quả.

Bảng so sánh

Cuối cùng, cũng nên liệt kê các điểm khác biệt giữa hai khái niệm này để bạn có thể sử dụng được khi cần thiết. Các điểm khác biệt này có thể khác nhau tùy vào ngôn ngữ mà bạn sử dụng. Vì vậy bạn chỉ cần nhớ các điểm căn bản sau:
InterfaceAbstract class
Multiple inheritanceMột class có thể hiện thực nhiều interface.(tạm coi là thừa kế)Không hỗ trợ đa thừa kế
Default implementationKhông thể định nghĩa code xử lý, chỉ có thể khai báo.Có thể định nghĩa thân phương thức, property.
Access ModifiersMọi phương thức, property đều mặc định là public.Có thể xác định modifier.
Adding functionalityMọi phương thức, property của interface cần được hiện thực trong class.Không cần thiết.
Fields and ConstantsKhông

Nguồn: Internet

0 nhận xét:

Đăng nhận xét

Được tạo bởi Blogger.