Abstract Class là gì? Công cụ để đạt được Abstraction

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

1. Abstract Class là gì?

Abstract Class có nghĩa là một lớp trừu tượng. Abstract Class là một loại lớp trong OOP – Lập trình hướng đối tượng. Abstract Class khai báo một hay nhiều method trừu tượng. Chúng có thể có cả method trừu tượng và method cụ thể. Một lớp bình thường không thể có method trừu tượng. Điều này có nghĩa là một abstract class phải chứa ít nhất một method trừu tượng. 

abstract class là một lớp trừu tượng

Một method trừu tượng là một method được khai báo không có triển khai (không có dấu ngoặc nhọn và kết thúc là một dấu chấm phẩy).

Một Abstract Class không thể tạo đối tượng nhưng có thể bao gồm lớp con. Khi một lớp trừu tượng bao gồm các lớp con, lớp con thường cung cấp triển khai cho tất cả các method trừu tượng của lớp cha. Ngoài ra, lớp trừu tượng có thể có trường động và trường tĩnh. Tuy nhiên, nếu lớp con không triển khai cho lớp cha, nó cũng sẽ là một lớp trừu tượng.

2. Abstract Class và Interface 

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

Với Interface, các trường đều tự động là công khai và tĩnh. Các method bạn khai báo hay định nghĩa (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, dù lớp đó có trừu tượng hay không. Nhưng bạn lại có thể triển khai không giới hạn số lượng Interface. 

3. Sử dụng Abstract Class và Interface

Bạn nên cân nhắc sử dụng Abstract Class trong những trường hợp sau:

  • Bạn muốn chia sẻ code giữa một vài lớp có liên hệ thân thiết.
  • Bạn kỳ vọng rằng những lớp extend Abstract Class của bạn có chung nhiều method hoặc trường hoặc yêu cầu truy cập bộ điều chỉnh thay vì công khai bộ điều chỉnh. (Ví dụ là được bảo vệ hoặc riêng tư).
  • Bạn muốn khai báo trường động hoặc trường tĩnh. Điều này cho phép bạn định nghĩa method có thể tiếp cận và điều chỉnh tính chất của đối tượng.

Với Interface, bạn nên sử dụng khi:

  • Bạn kỳ vọng rằng những lớp không liên quan sẽ triển khai interface của bạn. Ví dụ, Interface ComparableCloneable được triển khai bởi những lớp không liên quan. 
  • Bạn muốn cụ thể hóa hành vi của một loại dữ liệu nhất định, nhưng không bận tâm đến ai sẽ triển khai hành vi.
  • Bạn muốn tận dụng nhiều loại kế thừa (inheritance). 

4. Ví dụ về Abstract Class

Trường hợp nên dùng Abstract Class

Trong một phần mềm vẽ hướng đối tượng, bạn có thể vẽ hình tròn, hình chữ nhật, đường kẻ, đường cong Bezier… Những đối tượng này này đều có các tính chất nhất định (như vị trí, định hướng, màu đường viền, màu trong) và các hành vi (như di chuyển, quay, đ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 là giống nhau (như vị trí, màu viền, di chuyển). Số khác yêu cầu những triển khai khác nhau như điều chỉnh kích thước hay vẽ. Tất cả các GraphicObject phải có khả năng vẽ hay đ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 đó.

Sử dụng Abstract Class

Đây là một trường hợp hoàn hảo để sử dụng lớp cha là Abstract Class. Bạn có thể tận dụng 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 thể hiện rõ mối liên hệ này:

Các lớp hình chữ nhật, đường kẻ, đường cong Bezier và hình tròn đều kế thừa từ lớp cha GraphicObject

Đầu tiên, bạn khai báo một Abstract Class, ở đâ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 và method moveTo. GraphicObject cũng phải khai báo 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: 

Hình ảnh một Abstract Class
Hình ảnh lớp cha GraphicObject, một abstract class.
(Nguồn: Oracle)

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: 

Lớp con không trừu tượng thuộc Abstract Class
Khai báo lớp không trừu tượng thuộc một lớp cha Abstract Class

Got It hy vọng rằng bài viết trên đây đã cung cấp cho bạn một cái nhìn đầy đủ hơn về Abstract Class là gì. Happy Coding!

Got It Vietnam – Tham khảo: Guru99, Oracle, W3schools

Đọc thêm về quy trình tuyển dụng tại đây.

https://d1iv5z3ivlqga1.cloudfront.net/wp-content/uploads/2021/04/29235048/1_QAG9RXQyyMAY7i9OYo84FA.png
Got It Vietnam
January 26, 2021
Share this post to:
0 Comments
Inline Feedbacks
View all comments
Các bài viết liên quan
Tổng quan về Prompt Engineering

Tổng quan về Prompt Engineering

Tác giả: Công Anh (Software Engineer | Got It AI) Trong tech blog số này, Got It sẽ cùng bạn tìm hiểu về Prompt Engineering cũng như một số kỹ thuật cơ bản giúp đầu ra của Large Language Models (LLMs) tối ưu nhất có thể! Mục lụcChatGPT là gì? Hoạt động như thế nào?Prompt […]
Các bước tạo một thư viện Python

Các bước tạo một thư viện Python

Tác giả: Minh (Software Engineer | CAI) Trong Tech Blog số này, Got It sẽ cùng bạn tìm hiểu về 6 bước để tạo và phân phối một thư viện Python. Cụ thể, chúng ta sẽ viết một CLI command tương tự cowsay cùng với một function để các package khác có thể import và […]
Sử dụng pre-commit để thực thi PEP8 chỉ trong 3 bước

Sử dụng pre-commit để thực thi PEP8 chỉ trong 3 bước

Tác giả: Kiên (Software Engineer | CAI) Đảm bảo code tuân thủ đầy đủ các quy tắc được đề xuất trong PEP8 là một điều vô cùng quan trọng, đặc biệt là trong làm việc nhóm, khi mà yếu tố dễ đọc, dễ hiểu, và dễ bảo trì code được đặt lên hàng đầu. Dẫu […]
Giải mã Unicode

Giải mã Unicode

Tác giả: Casey (Software Engineer | CAI) Unicode, UTF-8, ASCII là những thuật ngữ rất quen với anh chị em lập trình viên, nhưng tại sao nó lại có mặt, nó giải quyết vấn đề gì và bugs gì có thể sinh ra nếu ta không nắm được nó, thì không phải lập trình viên […]
Hướng dẫn cách triển khai và debug code Python trên Docker

Hướng dẫn cách triển khai và debug code Python trên Docker

Tác giả: Kiên (Software Engineer | CAI) Bạn đã bao giờ mất hàng tiếng đồng hồ, thậm chí vài ngày để cài đặt một số thư viện cần thiết cho việc chạy một project trên máy tính của mình chưa? Nếu có thì đây là bài viết dành cho bạn. Thông thường, khi bạn tham […]
Hướng dẫn chi tiết cách push code lên Git

Hướng dẫn chi tiết cách push code lên Git

Có lẽ các bạn theo đuổi lĩnh vực IT đã quen thuộc với Git và GitHub rồi đúng không nhỉ? Tuy nhiên, Got It nhận thấy, một vài bạn đọc theo dõi blog vẫn còn mơ hồ, hoặc chưa biết cách để push code lên Git. Vậy thì hôm nay, chúng mình sẽ mang đến […]