Sígueme con flutter: Tomemos un ejemplo para explicar el mixin en dart de una manera fácil de entender

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

inserte la descripción de la imagen aquí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

  1. mixin no tiene constructor y no puede ser instanciado
  2. Se puede usar como una interfaz y debe implementarse después de mezclar la clase.
  3. Puede usar on para especificar el tipo de clase mixta, si no es un error.
  4. 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{ }
复制代码

Supongo que te gusta

Origin juejin.im/post/7078578398670356510
Recomendado
Clasificación