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

Trong lập trình hướng đối tượng (OOP), sự trừu tượng (abstraction) giúp tiết lộ các đặc tính quan trọng và ẩn các thông tin không quan trọng. Để đạt được sự trừu tượng này, người ta sử dụng khái niệm Abstract Class. Hãy cùng tìm hiểu chi tiết về Abstract Class là gì.

1. Abstract Class là gì?

Abstract Class là một loại lớp trừu tượng trong lập trình hướng đối tượng (OOP). Abstract Class chứa các phương thức trừu tượng (abstract methods). Ngoài ra, nó cũng có thể chứa các phương thức cụ thể (concrete methods). Một lớp thông thường không thể chứa phương thức trừu tượng, điều này có nghĩa là Abstract Class phải chứa ít nhất một phương thức trừu tượng.

Khái niệm Abstract Class

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

Abstract Class không thể được khởi tạo thành đối tượng, nhưng có thể được kế thừa bởi các lớp con. Khi các lớp con kế thừa Abstract Class, chúng phải cung cấp triển khai cho tất cả các phương thức trừu tượng của lớp cha. Ngoài ra, Abstract Class cũng có thể chứa các trường (fields) động và tĩnh. Tuy nhiên, nếu một lớp con không triển khai tất cả các phương thức trừu tượng của lớp cha, nó cũng sẽ trở thành một lớp trừu tượng.

Có Thể Bạn Quan Tâm :   Cỏ 4 lá là gì? Có ý nghĩa như thế nào trong tình yêu và phong thủy?

2. Sự khác biệt giữa Abstract Class và Interface

Abstract Class và Interface đều không thể tạo ra đối tượng, và cả hai đều chứa các phương thức được khai báo có hoặc không có triển khai. Tuy nhiên, có một số điểm khác biệt quan trọng:

  • Abstract Class cho phép khai báo các trường không tĩnh, trong khi Interface chỉ cho phép khai báo các trường tĩnh.
  • Với Abstract Class, bạn có thể xác định các phương thức công khai (public), phương thức bảo vệ (protected), và phương thức riêng tư (private), trong khi với Interface, tất cả các phương thức đều là công khai (public) và không thể có bất kỳ phạm vi truy cập khác.
  • Một lớp chỉ có thể kế thừa một Abstract Class, nhưng nó có thể triển khai nhiều Interface.

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

Dưới đây là một số hướng dẫn để giúp bạn quyết định khi nào nên sử dụng Abstract Class và Interface:

  • Sử dụng Abstract Class khi bạn muốn chia sẻ mã giữa nhiều lớp có quan hệ mật thiết.
  • Sử dụng Abstract Class khi bạn mong đợi các lớp con của Abstract Class có những phương thức hoặc trường chung, hoặc yêu cầu truy cập các phương thức điều chỉnh (được bảo vệ hoặc riêng tư) thay vì công khai.
  • Sử dụng Abstract Class khi bạn muốn khai báo các trường động hoặc trường tĩnh, và muốn xác định các phương thức có thể truy cập và điều chỉnh các thuộc tính của đối tượng.
  • Sử dụng Interface khi bạn mong đợi các lớp không liên quan sẽ triển khai Interface của bạn.
  • Sử dụng Interface khi bạn muốn cụ thể hóa hành vi cho một loại dữ liệu nhất định mà không quan tâm đến ai sẽ triển khai hành vi đó.
  • Sử dụng Interface khi bạn muốn tận dụng nhiều loại kế thừa (inheritance).
Có Thể Bạn Quan Tâm :   Scudetto là gì? 7 điều thú vị về giải đấu hàng đầu nước Ý

4. Ví dụ về Abstract Class

Trường hợp nên sử dụng Abstract Class

Giả sử bạn đang phát triển một phần mềm vẽ các hình học như hình tròn, hình chữ nhật, đường kẻ, và đường cong Bezier. Các đối tượng này đều có các thuộc tính nhất định (như vị trí, hướng, màu đường viền, màu nền) và các hành vi (như di chuyển, xoay, thay đổi kích thước, vẽ). Một số thuộc tính và hành vi của các đối tượng này giống nhau (như vị trí, màu viền, di chuyển), trong khi một số khác yêu cầu các triển khai khác nhau như thay đổi kích thước hoặc vẽ. Tất cả các đối tượng hình học phải có khả năng vẽ hoặc thay đổi kích thước của chúng, chỉ khác nhau ở cách thực hiện hành động đó.

Có Thể Bạn Quan Tâm :   Phần mềm Logo là gì? Hướng dẫn sử dụng phần mềm Logo chi tiết, dễ hiểu nhất

Sử dụng Abstract Class

Abstract Class là lựa chọn hoàn hảo trong trường hợp này. Bằng cách sử dụng lớp cha là Abstract Class, bạn có thể tận dụng các điểm chung giữa các đối tượng và khai báo rằng tất cả các đối tượng này kế thừa từ lớp cha GraphicObject. Ví dụ dưới đây minh họa mối quan hệ này:

Ví dụ về Abstract Class
Các lớp hình chữ nhật, đường kẻ, đường cong Bezier và hình tròn kế thừa từ lớp cha GraphicObject (Nguồn: Oracle)

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

Ví dụ về Abstract Class
Hình ảnh lớp cha GraphicObject là một Abstract Class (Nguồn: Oracle)

Mỗi lớp con của GraphicObject, chẳng hạn như Circle và Rectangle, phải cung cấp triển khai cho các phương thức draw và resize:

Khai báo các lớp con không trừu tượng của Abstract Class

Mong rằng bài viết trên đã giúp bạn hiểu rõ hơn về Abstract Class là gì. Happy Coding!

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

Back to top button