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é.
Mục lục
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.
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 Comparable và Cloneable đượ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:
Đầ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:
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:
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!