Triển khai giao diện
Thuộc phần Lập trình hướng đối tượng trong hành trình Java của Coddy. Bài học 35 trên 87.
Để sử dụng một giao diện, một lớp phải triển khai giao diện đó bằng từ khóa implements. Sau đó, lớp cung cấp phần triển khai cụ thể cho tất cả phương thức được khai báo trong giao diện:
public interface Drawable {
void draw();
}
public class Circle implements Drawable {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("Drawing a circle with radius " + radius);
}
}Nếu một lớp triển khai một giao diện nhưng không cài đặt đầy đủ tất cả phương thức của giao diện đó, trình biên dịch sẽ báo lỗi. Chú thích @Override là không bắt buộc, nhưng được khuyến nghị vì giúp phát hiện lỗi.
Tương tự như lớp trừu tượng, bạn có thể dùng giao diện làm kiểu tham chiếu. Điều này cho phép tính đa hình, nhờ đó các lớp khác nhau triển khai cùng một giao diện có thể được xử lý theo cách thống nhất:
Drawable shape1 = new Circle(5.0);
Drawable shape2 = new Rectangle(4.0, 3.0);
shape1.draw(); // Vẽ hình tròn có bán kính 5.0
shape2.draw(); // Vẽ hình chữ nhật kích thước 4.0 x 3.0Điều này rất hữu ích vì code làm việc với các tham chiếu Drawable không cần biết kiểu lớp cụ thể. Code chỉ cần đối tượng đó có thể được vẽ.
Trong bài học tiếp theo, bạn sẽ thấy cách một lớp có thể triển khai nhiều giao diện cùng lúc.
Thử thách
DễHãy xây dựng một hệ thống loa để minh họa cách các lớp triển khai giao diện. Bạn sẽ tạo một giao diện định nghĩa những gì mọi loa có thể làm, rồi xây dựng hai loại loa khác nhau, mỗi loại triển khai giao diện này theo cách riêng.
Bạn sẽ sắp xếp code trong bốn tệp:
Speaker.java: Định nghĩa một giao diện có tênSpeaker, khai báo những gì mọi loa cần có khả năng thực hiện. Mỗi loa cần có phương thứcspeak()trả về một String. Đây là hợp đồng mà mọi lớp triển khai giao diện phải tuân theo.Human.java: Tạo một lớp triển khai giao diệnSpeaker. Human có một trườngname(String). Thêm hàm khởi tạo để gán giá trị ban đầu cho name, rồi triển khai phương thứcspeak()để trả về:[name] says: Hello everyone!Robot.java: Tạo một lớp khác triển khai giao diệnSpeaker. Robot có một trườngmodel(String). Thêm hàm khởi tạo để gán giá trị ban đầu cho model, rồi triển khai phương thứcspeak()để trả về:Robot [model] says: Beep boop!Main.java: Kết hợp mọi thứ bằng đa hình dựa trên giao diện. Bạn sẽ nhận hai đầu vào: tên người và mẫu robot. Tạo một Human và một Robot, rồi lưu chúng trong một mảng các tham chiếuSpeaker. Duyệt qua mảng và in ra kết quả gọispeak()trên từng loa.
Bạn sẽ nhận hai đầu vào: tên người (String) và mẫu robot (String).
Đầu ra cần có hai dòng, mỗi loa một dòng. Hãy chú ý cách cả Human và Robot đều có thể được xử lý thống nhất thông qua giao diện Speaker, dù cách chúng phát ra tiếng hoàn toàn khác nhau!
Tự làm thử
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Đọc dữ liệu đầu vào
String humanName = scanner.nextLine();
String robotModel = scanner.nextLine();
// TODO: Tạo đối tượng Human với tên đã cho
// TODO: Tạo đối tượng Robot với mẫu đã cho
// TODO: Tạo mảng chứa các tham chiếu Speaker đến cả hai đối tượng
// TODO: Duyệt qua mảng và in ra kết quả của speak() cho từng speaker
}
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTừ khóa thisPhương thứcTrường (thuộc tính)Phương thức khởi tạoNạp chồng phương thức khởi tạoÔn tập: Máy tính đơn giản4Kế thừa
Kế thừa cơ bản (extends)Từ khóa superGhi đè phương thức (@Override)Chuỗi gọi hàm khởi tạoLớp ObjectKế thừa đơn và đa cấpVì sao không hỗ trợ kế thừa nhiều lớpÔn tập: Phân cấp lớp Employee7Phương thức đặc biệt và lớp Object
Phương thức toString()equals() và hashCode()Phương thức clone()compareTo() và ComparableGiao diện ComparatorÔn tập: sắp xếp tùy chỉnh2Bộ điều chỉnh quyền truy cập và đóng gói
Tổng quan về các mức truy cậpPhương thức getter và setterẨn thông tinTừ khóa finalÔn tập: Trình quản lý tài khoản ngân hàng5Tính đa hình
Kiến thức cơ bản về nạp chồng phương thứcGhi đè phương thức (thời gian chạy)Chuyển kiểu lên và chuyển kiểu xuốngToán tử instanceofLớp và phương thức trừu tượngÔn tập: máy tính hình học8Khái niệm OOP nâng cao
Kết hợp và kế thừaKết tập và hợp thànhLớp bên trong, lớp lồng nhau và lớp ẩn danhKiểu enum và phương thức enumBản ghi (Java 16+)Lớp sealed (Java 17+)3Thuộc tính lớp và thành viên tĩnh
Biến của instance và biến tĩnhPhương thức tĩnhKhối tĩnhHằng số (static final)Ôn tập: bộ đếm và tiện ích6Giao diện và lớp trừu tượng
Giới thiệu về giao diệnTriển khai giao diệnTriển khai nhiều giao diệnPhương thức mặc định và tĩnh trong giao diệnLớp trừu tượng và giao diệnGiao diện hàmÔn tập: hệ thống thanh toán9Kiểu tổng quát
Giới thiệu về kiểu tổng quátLớp tổng quátPhương thức tổng quátTham số kiểu có giới hạnKý tự đại diện (?, extends, super)Ôn tập: vùng chứa tổng quát12Mẫu thiết kế, phần 2
Mẫu CommandMẫu AdapterMẫu DecoratorMẫu Template MethodMẫu StateMẫu CompositeMẫu IteratorTự luyện tập: Trình biên dịch Java online