Mục lục
Khái niệm
Trừu tượng trong OOP cho phép ẩn đi quá trình thực thi bên trong và chỉ hiển thị những tính năng thiết yếu tới người dùng.
Ví dụ: Bạn đang có tiền và bạn muốn kiếm một nhà thầu xây dựng để xây cho mình một căn nhà ưng ý. Có ba nhà thầu A, B, C họ đến và đưa cho bạn bản thiết kế, mức giá, thời gian hoàn thành, ngôi nhà bạn sẽ như thế nào v.v. Còn việc họ làm thế nào để xây được căn nhà cho bạn thì bạn không biết.
Trong java, tính trừu tượng được thể hiện thông abstract class và interface.
Áp dụng trừu tượng vào lập trình chúng ta sẽ có những ưu điểm:
- Một abstract class được khai báo bằng từ khoá abstract.
- Một abstract method là một method được khai báo không có thân hàm.
- Các class con thừa kế abstract class phải implement abstract method.
- Abstract class không thể khởi tạo .
- Đơn giản hoá đối tượng bằng cách đưa ra các thuộc tính và phương thức mà nó có và thực hiện.
- Tập trung vào tính cốt lỗi của đối tượng. Ví dụ khi bạn xem method của class bất kỳ trong java chúng đều có mô tả rõ ràng về cách sử dụng, giá trị trả về, tham số truyền vào etc là bạn có thể sử dụng được.
Abstract class và cách sử dụng
Đôi khi chúng ta cần một superclass để định nghĩa cấu trúc cho các class khác thừa kế và triển khai theo cách riêng của nó nhưng vẫn tuân thủ khuôn mẫu của supperclass đặt ra. Đôi lúc chúng ta cần một supperclass định nghĩa những method dùng chung cho tất cả các class con thừa kế nó.
Abstract class sẽ kết hợp 2 điểm trên mà cung cấp cho chúng ta các kỹ thuật để vừa có thể định nghĩa khuôn mẫu, vừa có các method dùng chung cho các class con.
Ví dụ Chúng ta có superclass Shape, class Circle, Rectangle thừa kế Shape. Chúng ta có abstract method area(). Circle, Rectangle thừa kế từ Shape thì phải implement method area() riêng cho mình. method getColor() sẽ được Shape định nghĩa và cho các class con dùng chung.
// File Shape.java public abstract class Shape { String color; Shape(String color) { this.color = color; } abstract double area(); String getColor() { return this.color; } }
// File Rectangle.java public class Rectangle extends Shape{ double length; double width; Rectangle(String color,double length,double width) { super(color); this.length = length; this.width = width; } @Override double area() { return length*width; } }
// File Circle.java public class Circle extends Shape{ double radius; Circle(String color,double radius) { super(color); this.radius = radius; } @Override double area() { return Math.PI * Math.pow(radius, 2); } }
// File Main.java public class Main { public static void main(String[] args) { Shape circle = new Circle("red", 12d); Shape rectangle = new Rectangle("blue", 4, 3); System.out.println("Color circle: " + circle.getColor()); System.out.println("Area circle: " + circle.area()); System.out.println("Rectangle circle: " + rectangle.getColor()); System.out.println("Area rectangle: " + rectangle.area()); } }
Output:
Color circle: red
Area circle: 452.3893421169302
Rectangle circle: blue
Area rectangle: 12.0
Note:
- area() là abstract method cho nên các class con bắt buộc phải implement lại area(), nếu không chúng ta sẽ bị lỗi biên dịch.
- area() đóng vai trò là một khuôn mẫu cho các class con. Các class con dựa vào khuôn mẫu đó mà triển khai riêng cho nó.
- getColor() được xem như là một method sử dụng chung cho tất cả các class con.
Ưu điểm tính trừu tượng
- Tránh duplicate code và tăng tính tái sử dụng code.
- Tăng tính minh bạch nhờ vào việc áp dụng trừu tượng để tạo khuôn mẫu chung cho các đối tượng. Nhờ vào đó chúng ta có thể biết được luồng chạy của các object cùng loại(extends từ một superclass) mà không cần đi đến chi tiết.