Abstraction
Duy Văn | 11/03/2025
Như đã nói ở bài trước Encapsulation, khái niệm này liên quan mật thiết đến Abstraction, để giới thiệu qua một chút về Abstraction
Abstraction, về cơ bản là quá trình ẩn đi các chi tiết và chỉ đưa lên cho người dùng những thông tin quan trọng nhất và nó được thực hiện qua abstract class và interface
- Abtract class là một class không thể dùng để tạo ra object mà nó sinh ra để tạo ra các class khác. Abstract class đóng vai trò như bản mẫu của các class con, ép buôc các class con phải tuân theo các quy luật của nó, các quy luật này chính là các method đóng vai trò interface
- Abstract method: Các method không có body mà chỉ có tên, khi các class con của Abstract class kế thừa từ Abstract class thì các class con buộc phải cho các abstract method một body hoàn chỉnh. Abstract method được sử dụng như là các method đóng vai trò interface. Chỉ khi class con cung cấp đủ body cho các abstract method thì class con mới có thể tạo ra object
Abstract class có thể có các method thường, các method này không nằm trong số các method vai trò interface
Ví dụ
abstract class Animal{
public abstract void animalSound();
public void sleep(){
System.out.println("zzz");
}
}
Ở ví dụ trên, với class Animal đã được chuyển thành abstract, chúng ta có một method abstract là animalSound, rõ ràng context của method này là mô phỏng tiếng kêu của động vật, nhưng mỗi loài lại có tiếng kêu khác nhau, nhưng tiếng ngủ thì giống nhau, vậy nên method animalSound cần phải thay đổi giữa các class con cụ thể của từng loài, nhưng cũng đồng thời bắt buộc phải có ở các class này vì loài nào cũng có tiếng kêu. Tiếp theo để tạo ra một class con kế thừa Animal thì syntax
class Dog extends Animal{
public void animalSound(){
System.out.println("Gâu gâu");
}
}
Ở đây class chó sẽ mở rộng từ class Animal và cung cấp body cho abstract method animalSound
Interface
Interface là một cách khác để ứng dụng Abstraction trong Java, một interface cũng tương đương với một Abstract Class, nhưng khác ở chỗ tất cả các method của nó đều sẽ là abstract method
interface Animal{
public void animalSound();
public void sleep();
}
Để sử dụng được các method trên thì interface này cần được implement bằng code sử dụng một class khác, cú pháp nó sẽ như sau
class Dog implements Animal{
public void animalSound(){
System.out.println("Gâu gâu");
}
public void sleep(){
System.out.println("zzz");
}
}
Như vậy, chúng ta đã tạo ra một class Dog implement từ interface Animal, và cung cấp body cho các method của interface Animal
Liên hệ giữa Encapsulation và Abstraction
Quay trở lại với sự liên quan tới Encapsulation
Hãy tưởng tượng chúng ta đang ứng dụng abstraction cho concept của một cái ô tô, một cái xe là một tổ hợp nhiều thành phần bên trong, động cơ, bộ dẫn động, hệ thống autosar, v.v… Tuy nhiên, thực tế cho thấy chúng ta đã đơn giản hoá cách hiểu của chúng ta về xe ô tô khi vận hành nó thông qua Abstraction. Chúng ta đều biết sử dụng ô tô, tất cả các mẫu trên thế giới thông qua giao diện chung, tức là một cái vô lăng, chân ga, chân phanh, tay côn,… Các đặc điểm này của xe hơi chính là cái giao diện chung, sáng anh lái cái sedan, chiều lái SUV thì nó vẫn lái cùng một kiểu
Nhưng biết lái không có nghĩa là biết chi tiết của từng con xe, vì chúng ta vốn không cần biết vẫn có thể sử dụng, thời gian đầu ô tô làm gì có phanh ABS, sau này khi phanh ABS được lắp thì chúng ta vẫn phanh xe lại bằng cách đạp chân ga thôi, không có gì thay đổi từ góc độ giao diện.
Encapsulation là để tận dụng điểm mạnh của Abstraction, nếu abstraction đã ẩn đi các logic phức tạp và cung cấp cho người dùng một giao diện chung, thì encapsulation sẽ càng đẩy mạnh hơn nữa và cho phép linh động trong việc cập nhật, thay đổi cấu trúc bên trong mà không ảnh hưởng đến giao diện chung