Skip to Content

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ụng
  • with để sử dụng mixin
  • Có thể kết hợp nhiều mixins
  • on giới hạn superclass
  • Thứ tự mixins ảnh hưởng override
  • Giải quyết vấn đề multiple inheritance
Last updated on