Mixins trong Dart
1. Giới thiệu
Mixin cho phép tái sử dụng code của một class trong nhiều class khác, giải quyết hạn chế single inheritance.
2. Khai báo Mixin
mixin Swimming {
void swim() {
print('Swimming...');
}
}
mixin Flying {
void fly() {
print('Flying...');
}
}
class Duck with Swimming, Flying {
String name;
Duck(this.name);
}
void main() {
var duck = Duck('Donald');
duck.swim(); // Swimming...
duck.fly(); // Flying...
}3. Mixin với state
mixin Counter {
int _count = 0;
int get count => _count;
void increment() => _count++;
void decrement() => _count--;
void reset() => _count = 0;
}
class ClickCounter with Counter {
String label;
ClickCounter(this.label);
}
void main() {
var counter = ClickCounter('Clicks');
counter.increment();
counter.increment();
print('${counter.label}: ${counter.count}');
}4. Kết hợp extends và with
class Animal {
String name;
Animal(this.name);
}
mixin Swimmer {
void swim() => print('Swimming');
}
mixin Runner {
void run() => print('Running');
}
class Dog extends Animal with Runner {
Dog(String name) : super(name);
}
class Fish extends Animal with Swimmer {
Fish(String name) : super(name);
}5. Mixin với on constraint
class Performer {
void perform() => print('Performing');
}
mixin Musical on Performer {
void playMusic() {
perform(); // Có thể gọi method từ Performer
print('Playing music');
}
}
class Musician extends Performer with Musical {}
void main() {
var musician = Musician();
musician.playMusic();
}6. Thứ tự Mixin quan trọng
mixin A {
String greet() => 'A';
}
mixin B {
String greet() => 'B';
}
class TestAB with A, B {}
class TestBA with B, A {}
void main() {
print(TestAB().greet()); // B (cuối cùng thắng)
print(TestBA().greet()); // A
}7. Ví dụ thực tế
mixin Loggable {
void log(String message) {
print('[${DateTime.now()}] $message');
}
}
mixin Validatable {
bool validate() => true;
}
class UserService with Loggable, Validatable {
void createUser(String name) {
log('Creating user: $name');
if (validate()) {
log('User created successfully');
}
}
}8. Mixin class (Dart 3.0+)
mixin class Describable {
String describe() => 'Describable object';
}
// Có thể dùng như mixin
class Product with Describable {}
// Hoặc như class thường
class Item extends Describable {}📝 Tóm tắt
mixinđịnh nghĩa code tái sử dụngwithđể sử dụng mixin- Có thể kết hợp nhiều mixins
ongiới hạn superclass- Thứ tự mixins ảnh hưởng override
- Giải quyết vấn đề multiple inheritance
Last updated on