prefacio
A diferencia de java y kotlin, hay una palabra clave especial mixin (mix-in) en dart. Cuando una clase que usa esta palabra clave es (incluida) por otras clases, otras clases tienen los métodos de esta clase. De esta manera, el código se puede reutilizar sin extender.
Escenarios para mostrar cómo se pueden usar los mixins
Dado que la extensión y los implementos se usan a menudo en java y kotlin y no sé cómo usar mixin, le daré algunos ejemplos especiales para ayudarlo a comprender
Caso de uso del escenario
Como se muestra en la imagen de uml anterior, las aves son la clase principal y las habilidades necesarias para las aves son (poner huevos y caminar), mientras que los gansos y los gorriones, como sus subclases, pueden volar, pero los pingüinos no. Entonces volar se ha convertido en una habilidad de las aves individuales.Si volar se define en la clase principal, habrá una implementación vacía en los pingüinos. Si define una interfaz para implementar el vuelo, debe volver a escribir el código para volar en pájaros que pueden volar. Cómo hacer esto fácil. Luego usamos mixin (with) para implementar el siguiente código:
abstract class Bird{
void walk() { print('我会走路'); }
void xiadan() { print('我会下蛋'); }
}
abstract class Fly{
void fly() { print('我会飞'); }
}
//大雁
class Dayan extends Bird with Fly {}
//企鹅
class Qier extends Bird {}
复制代码
Si la clase Fly no está destinada a usarse como una clase normal, reemplace class con la palabra clave mixin.
mixin Fly{
void fly() { print('我会飞'); }
}
复制代码
Si la clase Fly solo quiere limitarse a las aves, entonces se deben agregar las siguientes palabras clave
mixin Fly on Bird{
void fly() { print('我会飞'); }
}
复制代码
características de mezcla
- mixin no tiene constructor y no puede ser instanciado
- Se puede usar como una interfaz y debe implementarse después de mezclar la clase.
- Puede usar on para especificar el tipo de clase mixta, si no es un error.
- Si hay el mismo método en varias clases después de with, si la clase actual anula el método, se llamará al método de la clase actual. Si el método no es anulado por la clase utilizada actualmente, se llamará al método de la clase más alejado de la palabra clave with.
pantalla de secuencia de llamadas
llamadas secuenciales simples
Si hay el mismo método en varias clases después de with, si la clase actual anula el método, se llamará al método de la clase actual. Si el método no es anulado por la clase utilizada actualmente, se llamará al método de la clase más alejado de la palabra clave with.
abstract class First {
void doPrint() {
print('First');
}
}
abstract class Second {
void doPrint() {
print('Second');
}
}
class Father {
void doPrint() {
print('Father');
}
}
class Son extends Father with First,Second {
}
复制代码
transferir:
Son son = Son();
son.doPrint();
复制代码
Imprimir:
Second
复制代码
Llamado después de reescribir
class Son extends Father with First,Second {
void doPrint() {
print('Son');
}
}
复制代码
transferir:
Son son = Son();
son.doPrint();
复制代码
Imprimir:
Son
复制代码
con llamada de método de clase padre
class Father {
void init() {
print('Father init');
}
}
mixin FirstMixin on Father {
void init() {
print('FirstMixin init start');
super.init();
print('FirstMixin init end');
}
}
mixin SecondMixin on Father {
void init() {
print('SecondMixin init start');
super.init();
print('SecondMixin init end');
}
}
class Son extends Father with FirstMixin, SecondMixin {
@override
void init() {
print('Son init start');
super.init();
print('Son init end');
}
}
复制代码
transferir:
Son().init();
复制代码
Imprimir:
flutter: Son init start
flutter: SecondMixin init start
flutter: FirstMixin init start
flutter: Father init
flutter: FirstMixin init end
flutter: SecondMixin init end
flutter: Son init end
复制代码
ilustrar
Manera | Tipos de | ilustrar |
---|---|---|
con | mezclando | mezclar en este contenido |
con encendido | mezclando | Mezclar el contenido de esta clase, pero debe ser el tipo de la característica |
prestar atención
Un mixin puede estar en varias clases, pero la clase anterior ya debe tener una implementación relacionada
mixin Mix on Mix1,Mix2{ }
复制代码