Abstraction của OOP tiết lộ các đặc tính mang tính cần thiết, giấu đi thông tin không quan trọng. Abstraction chỉ có thể đạt được khi bạn thông qua Abstract Class. Các bạn hãy cùng tìm hiểu Abstract Class là gì nhé. 

Chắc hẳn là mọi lập trình viên hiện nay đều đã quá quen với lập trình hướng đối tượng, nhưng với Abstract Class và Interface thì bạn có thực sự hiểu chúng? Abstract class là gì? Phân biệt Abstract Class và Interface như thế nào? Rất nhiều người trong số chúng ta đã sử dụng chúng nhiều nhưng lại chưa thực sự hiểu bản chất, chúng ta cùng nhau tìm hiểu rõ hơn để có thể phân biệt Abstract Class và Interface và có thể ứng dụng chúng tốt hơn nhé.

I. Abstract class là gì?

Abstract Class là gì? Nó có nghĩa là một lớp trừu tượng. Abstract Class là một loại lớp trong OOP, còn được biết đến là lập trình hướng đối tượng. Abstract Class khai báo cho một hay nhiều method trừu tượng cùng một lúc. Chúng có thể có riêng hoặc có cả method trừu tượng và method cụ thể. Một lớp bình thường thì sẽ không thể có method trừu tượng. Điều này có nghĩa rằng một abstract class bắt buộc phải chứa ít nhất một method trừu tượng. Có 2 loại method bao gồm abstract method và method thường: 

  • abstract method là method trống không có khả năng thực thi.
  • method thường là method có khả năng thực thi.

Không thể khởi tạo mọi loại đối tượng của abstract class và hơn hết là không hỗ trợ đa kế thừa. Phương thức abstract của abstract class sẽ không được phép khai báo về nội dung phương thức. Nó chỉ có thể là những định nghĩa tên cũng như các tham số đầu vào.

Abstract class là gì?

Abstract class là gì?

Mức truy cập của các hàm của abstract phải ở chế độ public hoặc protected để lớp kế thừa sau có thể định nghĩa lại và các thuộc tính của lớp abstract sẽ không được khai báo abstract. Ví dụ như: khai báo 1 abstract class. 
Một Abstract Class không thể tạo ra trưđối tượng nhưng nó có thể bao gồm lớp con. Khi một lớp trừu tượng mà bao gồm các lớp con, lớp con sẽ thường cung cấp triển khai cụ thể cho tất cả các method trừu tượng của lớp cha trước đó. Ngoài ra, lớp trừu tượng này có thể có trường động và trường tĩnh. Tuy nhiên, nếu lớp con không thực hiện triển khai cho lớp cha, nó cũng sẽ là một lớp trừu tượng tiếp theo.

Xem thêm: Ngôn ngữ lập trình là gì? Top 10 ngôn ngữ lập trình phổ biến nhất hiện nay

II. Interface là gì? 

Interface là một Template (khuôn mẫu) cố định, nó không phải là một lớp đối tượng nào hết. Để khai báo một Interface ta sẽ dùng từ khóa interface để thay thế cho từ khóa class. Hầu như tất cả các hàm trong interface đều sẽ ở dạng khai báo và không được định nghĩa (giống lớp abstract). Đây chính là cấu trúc trong OOP cho phép các class khác có thể implements với nhau. Một đối tượng implement một interface thì nó sẽ phải khai báo và định nghĩa lại tất cả các hàm trong Interface. Interface là dạng không thể khởi tạo. Phương thức trong Interface là bắt buộc toàn bộ các phương thức trừu tượng. Các phương thức trong Interface này chỉ có thể được định nghĩa cụ thể với khả năng là public và cũng không được định nghĩa chính xác nội dung. Interface có thể được extends từng thời điểm với nhau.
1 class có thể implements ra nhiều Interface. Ví dụ như:     

Xem thêm: DHCP là gì? Gợi ý các giải pháp để bảo mật của DHCP

III. Phân biệt Abstract class và Interface 

Mục đích chính của đối tượng là nhằm tổ chức một hệ thống mã nguồn tốt hơn, mã nguồn có khả năng tái sử dụng và làm cho lập trình giống như việc tổ chức quản các đối tượng trên thế giới thực. Người ta “đẻ” ra những khái niệm về Class, abstract class, interface, inner class nhằm phục vụ cho mục đích to lớn này. Sau đây là những phân tích rõ hơn để mọi người có thể phân biệt Abstract Class và Interface.

Abstract class

Giả sử bạn có hai lớp đó là ConNguoi và ConCho,  và bạn có một thuộc tính là viTri. Cả hai lớp này thì đều có một hàm là thaydoiViTri, nó nhận vào một tọa độ và cập nhật tọa độ mới trực tiếp cho hai đối tượng thuộc hai lớp này. Như vậy bạn cần phải viết hai được đoạn mã nguồn giống nhau cho hai lớp khác nhau.

Vậy thì có cách nào tái sử dụng đoạn mã nguồn này dễ dàng không? Bạn có thể tạo một lớp cha của cả hai lớp này đó là lớp DongVat, cài đặt phương thức thaydoiViTri cho nó. Nhưng điều này sẽ lại gây ra một vấn đề đó là khi có một người khác sử dụng thư viện do bạn viết ra, người ta cũng có thể tạo một đối tượng khác của lớp ĐộngVật mà thực tế, đối tượng đó lại không có ý nghĩa và sẽ làm sai hoạt động của toàn bộ thư viện bạn viết ra.

Lúc đó người ta sẽ lại nghĩ ra khái niệm abstract class, là một lớp nhưng lại không thể tạo ra thực thể. Về mặt kỹ thuật thì abstract class có thể chứa hoặc là không chứa phương thức abstract - một phương thức chỉ có thể khai báo mà không chứa mục cài đặt.

Interface

Ở C++ sẽ không tồn tại khái niệm interface chuyên về mặt kỹ thuật, nhưng ở java thì lại có, nguyên nhân thì chúng ta tạm thời bỏ qua nhưng bạn có thể tìm hiểu kĩ hơn để hiểu rõ hơn về interface. Interface nó giống như một hợp đồng, nói rằng những lớp nào implement interface này phải thực hiện được những hàm được khai báo trong interface đó.
Lấy tiếp ví dụ ở trên. Giả sử ở đâu đó nơi mà bạn có một hàm thay đổi vị trí cho một object nào đó. Bạn có thể viết hàm thay đổi vị trí cho Người, cho Động Vật, cho Con Chó, nhưng giả sử có thêm một lớp nữa là lốp Xe thì sao? Có cách nào để có thể biết được một đối tượng bất kỳ có thể di chuyển được không? Khi đó, bạn có thể tạo ra một interface bất kì tên là Movable, và yêu cầu bất kỳ lớp nào implement phương thức này thì sẽ đều phải cài đặt một phương thức đó là thaydoiViTri.

Inner class

Inner Class, là một lớp mà ở đó bạn chỉ sử dụng bên trong một lớp hay một phương thức hay một đoạn chương trình, mục tiêu chính là làm cho việc tổ chức mã nguồn rõ ràng hơn. Inner class có rất nhiều loại, thông thường inner class được dùng để xử lý sự kiện, viết xử lý cho multithreaded job v.v… Mình mới chỉ xài những cái đó, còn ứng dụng khác thì mình không rõ lắm.

1. Sự giống nhau cơ bản giữa Abstract class và Interface   

Không thể tạo ra một biến giống kiểu interface hoặc abstract class.
Nếu đó là phương thức abstract thì chắc chắn phải được khai báo lại trong class con.
Cả interface và abstract class đều có tính chất kế thừa.

2. Sự khác nhau cơ bản giữa Abstract class và Interface

Tất cả phương thức mà có trong interface luôn luôn(được hiểu) là abstract.
Các phương thức có trong abstract class sẽ là abstract hoặc không phải là abstract.
Có thể implements nhiều interface nhưng chúng sẽ không thể extends trực tiếp với nhiều class.
Các phương thức có trong interface sẽ luôn luôn phải để là public, khác với abstract class bạn có thể để là public, private hoặc protected.

Xem thêm: Trực quan hoá dữ liệu là gì? Tại sao nói Data Visualization vô cùng quan trọng

III.  Sử dụng Abstract class và Interface

Abstract Class tương tự với Interface. Bạn đều không thể tạo ra đối tượng riêng cho chúng. Chúng đều có thể chứa các method được khai báo rõ ràng có hoặc không có triển khai. Tuy nhiên, với Abstract Class thì bạn lại có thể khai báo những trường không tĩnh. Bạn cũng có thể tự xác định các method mà công khai hay method được bảo vệ và method cụ thể riêng tư. 

Hướng dẫn sử dụng Abstract class và interface

Hướng dẫn sử dụng Abstract class và interface

Với Interface, các trường đều được tự động hóa là công khai và tĩnh. Các method bạn sẽ khai báo hay định nghĩa thì (là những method mặc định) đều là công khai. Ngoài ra, bạn chỉ có thể extend một lớp một, cho dù lớp đó có trừu tượng hay không. Ngoài ra thì bạn lại có thể triển khai một cách không giới hạn số lượng Interface. 

  • Interface : Khi bạn muốn tạo dựng một bộ khung chuẩn nào đó bao gồm các chức năng mà những module hay project luôn cần. Giống như là sau khi nhận requirement của khách hàng về team thì sau đó team sẽ ngồi với nhau và phân tích các đầu mục các tính năng của từng module, tiếp theo đó triển khai vào code viết các interface như đã phân tích ở trên, để các bạn dev sau có thể nhìn vào đó để thực hiện đầy đủ các tính năng (khi đã implement rồi thì không sót một tính năng nào ^^).
  • Abstract class: Giống như demo trên bạn có thể hiểu rằng là khi định nghĩa một đối tượng có những chức năng như A,B,C trong đó tính năng A,B chắc chắn sẽ được thực thi theo cách nào đó, còn tính năng C phải phụ thuộc vào những đối tượng cụ thể là gì, như đối tượng Dog, Cat tuy chúng đều có điểm chung là có thể phát ra âm thanh nhưng những âm thanh đó là khác nhau. Vì vậy method Speak() là abstract method chỉ để nhận định ra rằng tính năng này còn dang dở chưa rõ khi nào thực thi, các lớp extend sẽ phải hoàn thành nốt tính năng này, còn những tính năng khác đã hoàn thành thì vẫn sẽ sử dụng như bình thường đây là những tính năng chung

Xem thêm: JQuery là gì? Hướng dẫn cách sử dụng và download JQuery cơ bản

IV.  Ví dụ về Abstract class   

1. Trường hợp nên dùng Abstract class

Trong một phần mềm khác về vẽ hướng đối tượng, bạn có thể vẽ hình tròn, hình vuông, hình chữ nhật, đường kẻ hay đường cong Bezier… Những đối tượng này này đều có các tính chất chung nhất định (như vị trí, định hướng, điều chỉnh màu đường viền, màu trong) và các hành vi cụ thể (như di chuyển, quay, xoay, điều chỉnh kích thước, vẽ). Một vài tính chất và hành vi của những đối tượng này sẽ là giống nhau (như vị trí, màu viền hay di chuyển). Số khác sẽ yêu cầu những triển khai khác nhau như điều chỉnh kích thước, tỉ lệ hay vẽ. Tất cả các GraphicObject phải có khả năng vẽ thậm chí là điều chỉnh kích thước của nó, chỉ khác nhau ở cách chúng thực hiện việc đó như thế nào.

Sử dụng Abstract class

Đây là một trường hợp hoàn hảo để chúng ta sử dụng lớp cha là Abstract Class. Bạn có thể tận dụng hết những điểm giống nhau và khai báo các đối tượng này đều kế thừa từ đối tượng cha là GraphicObject. Mô hình dưới đây sẽ thể hiện rõ ràng về mối liên hệ này:

Đầu tiên, bạn sẽ khai báo một Abstract Class, ở đây chúng ta thấy chính là GraphicObject, để cung cấp các biến thành viên và các method được sử dụng ở đó bởi tất cả các lớp con. Đó có thể là vị trí hiện tại cho method moveTo. GraphicObject cũng phải khai báo cụ thể với các method trừu tượng cho phần method, ví dụ như draw hay resize để có thể triển khai những lớp con. Tuy nhiên các method này phải được triển khai một cách khác nhau. Lớp cha GraphicObject trông như sau: 

Mỗi lớp con không trừu tượng của GraphicObject, như Circle và Rectangle, phải cung cấp triển khai cho các method draw và resize: 

Xem thêm: Công nghệ số là gì? Tầm quan trọng của công nghệ số trong đời sống

V.  Kết luận 

Vậy qua bài viết trên của 123job.vn bạn đã hiểu Abstract class là gì chưa? Đó là toàn bộ những hiểu biết, thông tin của chúng mình về abstract class và interface trong php để giúp bạn đọc hiểu biết được Abstract class là gì. Qua đó sẽ giúp các bạn phân biệt Abstract Class và Interface Kiến thức mình cũng có hạn có gì sai sót mong các bạn comment đóng góp để chúng mình chỉnh sửa sớm nhất có thể. Cảm ơn mọi người đã theo dõi!