Triển khai nhiều 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 36 trên 87.
Khác với kế thừa lớp, khi bạn chỉ có thể mở rộng một lớp, Java cho phép một lớp triển khai nhiều giao diện. Đây là cách Java hỗ trợ một hình thức kế thừa đa lớp an toàn.
Để triển khai nhiều giao diện, hãy liệt kê chúng sau từ khóa implements, cách nhau bằng dấu phẩy:
public interface Drawable {
void draw();
}
public interface Resizable {
void resize(int width, int height);
}
public class Rectangle implements Drawable, Resizable {
private int width, height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
@Override
public void draw() {
System.out.println("Drawing rectangle " + width + "x" + height);
}
@Override
public void resize(int width, int height) {
this.width = width;
this.height = height;
}
}Lớp (class) phải triển khai tất cả phương thức (method) từ mọi giao diện (interface) mà nó khai báo. Bạn cũng có thể kết hợp kế thừa (inheritance) với nhiều giao diện:
public class Square extends Shape implements Drawable, Resizable {
// Phải triển khai các phương thức (methods) của cả hai giao diện (interfaces)
// Cũng có thể dùng các thành viên kế thừa từ Shape
}Sự linh hoạt này cho phép bạn thiết kế các lớp đáp ứng nhiều vai trò. Một SmartPhone có thể triển khai các giao diện Callable, Messageable và Browsable, mỗi giao diện định nghĩa những khả năng khác nhau mà điện thoại hỗ trợ.
Thử thách
DễHãy xây dựng một hệ thống thiết bị thông minh, trong đó mỗi thiết bị có thể có nhiều khả năng. Bạn sẽ tạo một SmartTV có thể bật/tắt và điều chỉnh âm lượng, qua đó minh họa cách một lớp có thể triển khai nhiều giao diện (interface) để đảm nhận các vai trò khác nhau.
Bạn sẽ sắp xếp code trong bốn tệp:
Powerable.java: Định nghĩa giao diện cho các thiết bị có thể bật/tắt. Giao diện này cần khai báo hai phương thức:powerOn()vàpowerOff(), cả hai đều trả về void.VolumeControl.java: Định nghĩa giao diện cho các thiết bị có thể điều chỉnh âm lượng. Giao diện này cần khai báo một phương thứcsetVolume(int level)trả về void và một phương thứcgetVolume()trả về một int.SmartTV.java: Tạo một lớp triển khai cả hai giao diệnPowerablevàVolumeControl. SmartTV của bạn cần có trườngbrand(String), trườngisOn(boolean, ban đầu là false) và trườngvolume(int, ban đầu là 0). Thêm hàm khởi tạo nhận tên thương hiệu. Triển khai tất cả các phương thức bắt buộc:powerOn()cần đặtisOnthành true và in ra:[brand] TV is now ONpowerOff()cần đặtisOnthành false và in ra:[brand] TV is now OFFsetVolume(int level)cần cập nhật âm lượng và in ra:[brand] TV volume set to [level]getVolume()cần trả về âm lượng hiện tại
Main.java: Kết hợp mọi thứ để minh họa cách triển khai nhiều giao diện. Bạn sẽ nhận hai đầu vào: tên thương hiệu (String) và mức âm lượng (int). Tạo một SmartTV với thương hiệu đã cho, sau đó:- Gọi
powerOn() - Gọi
setVolume()với mức âm lượng đã cho - Dùng
getVolume()để in ra:Current volume: [volume] - Gọi
powerOff()
- Gọi
Bạn sẽ nhận hai đầu vào: thương hiệu TV (String) và mức âm lượng (int).
Đầu ra của bạn cần có bốn dòng, minh họa cách SmartTV đáp ứng hợp đồng của cả hai giao diện. Thiết bị có thể bật/tắt như mọi thiết bị Powerable và điều chỉnh âm lượng như mọi thiết bị VolumeControl!
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 brand = scanner.nextLine();
int volumeLevel = scanner.nextInt();
// TODO: Tạo SmartTV với thương hiệu đã cho
// TODO: Gọi powerOn()
// TODO: Gọi setVolume() với mức âm lượng đã cho
// TODO: In ra: Current volume: [volume] bằng getVolume()
// TODO: Gọi powerOff()
}
}
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