Tạo Mixin
Thuộc phần Lập trình hướng đối tượng trong hành trình Dart của Coddy. Bài học 51 trên 110.
Bây giờ bạn đã hiểu mixin là gì, hãy cùng tìm hiểu cách tạo chúng cho đúng. Mixin được khai báo bằng từ khóa mixin thay vì class.
mixin Logging {
void log(String message) {
print('[LOG] $message');
}
void logError(String error) {
print('[ERROR] $error');
}
}Mixin có thể chứa phương thức, thuộc tính, thậm chí cả getter và setter, giống như lớp. Tuy nhiên, có một quy tắc quan trọng: mixin không thể có hàm khởi tạo. Vì mixin được thiết kế để được trộn vào thay vì khởi tạo trực tiếp, chúng không cần logic khởi tạo.
mixin Timestamped {
DateTime createdAt = DateTime.now();
String get formattedTime => createdAt.toString();
void printTimestamp() {
print('Created at: $formattedTime');
}
}
class Document with Timestamped {
String title;
Document(this.title);
}
void main() {
var doc = Document('Report');
doc.printTimestamp(); // Sử dụng phương thức (method) của mixin
print(doc.createdAt); // Sử dụng thuộc tính (property) của mixin
}Khi áp dụng một mixin bằng with, tất cả thành viên của nó trở thành một phần của lớp bạn. Lớp đó có thể sử dụng trực tiếp các thành viên này, và mọi đoạn code có một instance của lớp đó cũng vậy. Nhờ đó, mixin là cách gọn gàng để bổ sung chức năng có thể tái sử dụng mà không cần đến hệ thống kế thừa phức tạp.
Thử thách
DễHãy xây dựng một hệ thống nhắn tin để minh họa cách tạo mixin có phương thức, thuộc tính và getter. Bạn sẽ thiết kế một mixin bổ sung khả năng định dạng cho nhiều loại tin nhắn.
Bạn sẽ sắp xếp code thành hai tệp:
messaging.dart: Định nghĩa mixin và các lớp tin nhắn tại đây:- Một mixin
Formattablegồm:- Thuộc tính
String prefixđược khởi tạo bằng'>>>' - Getter
separatortrả về' | ' - Phương thức
format(String text)trả về chuỗi[prefix][separator][text] - Phương thức
formatBold(String text)trả về**[text]**
- Thuộc tính
- Một lớp
TextMessagesử dụng mixinFormattable. Thêm thuộc tínhString sendercùng hàm khởi tạo. Thêm phương thứcsend(String content)để in ra kết quả gọiformat()với[sender]: [content] - Một lớp
AlertMessagecũng sử dụng mixinFormattable. Thêm thuộc tínhString levelcùng hàm khởi tạo. Thêm phương thứcalert(String content)để in ra kết quả gọiformat()với[[level]] [formatBold(content)]
- Một mixin
main.dart: Nhập tệp nhắn tin và minh họa cách cả hai loại tin nhắn có được khả năng định dạng từ mixin:- Tạo một
TextMessagevới người gửi là'Alice' - Tạo một
AlertMessagevới cấp độ là'WARNING' - Gọi
send('Hello there!')trên tin nhắn văn bản - Gọi
alert('System overload')trên tin nhắn cảnh báo
- Tạo một
Mixin của bạn cho thấy mixin có thể chứa thuộc tính với giá trị mặc định, getter tính toán giá trị và nhiều phương thức có thể gọi lẫn nhau. Cả hai lớp tin nhắn đều có được toàn bộ chức năng này chỉ bằng cách sử dụng từ khóa with.
Đầu ra dự kiến:
>>> | Alice: Hello there!
>>> | [WARNING] **System overload**Tự làm thử
import 'messaging.dart';
void main() {
// TODO: Tạo TextMessage với người gửi là 'Alice'
// TODO: Tạo AlertMessage với mức là 'WARNING'
// TODO: Gọi send('Hello there!') trên tin nhắn văn bản
// TODO: Gọi alert('System overload') trên tin nhắn cảnh báo
}
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
1Nền tảng về lập trình hướng đối tượng
Tệp bên ngoàiThư viện và câu lệnh importGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTừ khóa thisPhương thứcBiến thể hiệnKiến thức cơ bản về hàm khởi tạoÔn tập: Máy tính đơn giản4An toàn với giá trị null
Giới thiệu về an toàn với giá trị nullCó thể null và không thể nullToán tử ? và !Từ khóa late và an toàn với giá trị nullToán tử xử lý nullAn toàn với giá trị null trong lớpÔn tập: hệ thống hồ sơ người dùng7Lớp trừu tượng và interface
Lớp trừu tượngPhương thức trừu tượngInterface trong DartInterface ngầm địnhTriển khai và kế thừaNhiều interfaceÔn tập: Máy tính hình10Bộ sưu tập và kiểu tổng quát
Tổng quan về List, Set và MapBộ sưu tập an toàn về kiểuLớp tổng quátPhương thức tổng quátRàng buộc kiểu tổng quátIterable và IteratorÔn tập: Lưu trữ tổng quát2Hàm khởi tạo trong Dart
Hàm khởi tạo mặc địnhHàm khởi tạo có tênDanh sách khởi tạoHàm khởi tạo hằng sốHàm khởi tạo nhà máyHàm khởi tạo chuyển hướngÔn tập: Trình tạo hình dạng5Đóng gói
Thành viên công khai và riêng tưQuy ước tiền tố _Tính riêng tư ở cấp thư việnTìm hiểu sâu về getter và setterChe giấu thông tinÔn tập: hồ sơ học sinh8Mixin
Giới thiệu về MixinTạo MixinSử dụng nhiều MixinTừ khóa on trong MixinMixin và kế thừaMixin và giao diệnÔn tập: hệ thống động vật3Thuộc tính của lớp
Thành viên instance và thành viên tĩnhTrường final và constBiến latePhương thức và trường tĩnhGetter và setterÔn tập: trình quản lý tài khoản ngân hàng6Kế thừa
Kế thừa cơ bảnTừ khóa superGhi đè phương thứcChú thích @overrideTừ khóa lớp finalHàm khởi tạo và kế thừaÔn tập: phân cấp nhân viên9Đa hình
Khái niệm cơ bản về đa hìnhĐa hình qua giao diệnKiểm tra kiểu lúc chạyToán tử is và asTừ khóa hiệp biếnÔn tập: Bộ xử lý thanh toánTự luyện tập: Trình biên dịch Dart online