Mezclando clase mezclando en Dart

introducir

Mixin es un patrón de método para reutilizar código en una clase en herencia múltiple.

Los mixins son clases en lenguajes de programación orientados a objetos que proporcionan implementaciones de métodos . Otras clases pueden acceder a los métodos y variablesmixin de la clase sin ser una subclase de la misma .

En pocas palabras, el diseño oficial es una clase que se puede reutilizar fácilmente, sin tener que implementar muchas interfaces.

Escenario de aplicación

 Por ejemplo, hay una superclase de Anmal, y hay tres subclases debajo de ella: Mammal, Bird y Fish, y hay más subclases debajo de ella.

Aquí tomamos tres clases como ejemplos, a saber, Pato, Gato y Paloma. Entre ellos, Pato puede hacer los tres métodos, Gato puede caminar y Paloma puede caminar y volar. Si desea utilizar la herencia para implementarla, es como sigue:

abstract class Animal{}
abstract class Swim{
  void swim();
}
abstract class Walk{
  void walk();
}
abstract class Fly{
  void fly();
}

class Duck extends Animal implements Swim,Walk,Fly{
  @override
  void fly() => print("fly");

  @override
  void swim() => print("swim");

  @override
  void walk() => print("walk");

}
class Cat extends Animal implements Walk{
  @override
  void walk() => print("walk");
}
class Dove extends Animal implements Walk,Fly{
  @override
  void fly() => print("fly");

  @override
  void walk() => print("walk");
}
void main(){
  Duck().swim();
  Duck().walk();
  Duck().fly();
  Cat().walk();
  Dove().fly();
  Dove().walk();
}

Los resultados de salida son los siguientes:

 Debido a que dart también es un lenguaje de herencia simple, este uso es exactamente el mismo que en Java, pero es muy redundante reescribir todos los métodos en la interfaz. ¿Hay alguna manera de que podamos reutilizar los métodos en la interfaz? En este momento Puedes usar el mixin.

Usamos mixin en lugar de interface.Si desea reutilizar el método de mixin class, solo necesita agregar la palabra clave with después de la clase, de la siguiente manera:

abstract class Animal{}

mixin Swim{
  void swim() => print("swim");
}
mixin Walk{
  void walk() => print("walk");
}
mixin Fly{
  void fly() => print("fly");
}

class Duck extends Animal with Swim,Walk,Fly{}
class Cat extends Animal with Walk{}
class Dove extends Animal with Walk,Fly{}

void main(){
  Duck().swim();
  Duck().walk();
  Duck().fly();
  Cat().walk();
  Dove().fly();
  Dove().walk();
}

El resultado impreso final es exactamente el mismo que el anterior, y el método para implementar el caso especial en la clase es el mismo que el método para usar la interfaz, simplemente reescríbalo directamente.

Uso avanzado

Propiedades de linealización de mixins.

Si existe el mismo método en la clase que mezclamos, ¿cómo se llamará? Por ejemplo, el método run() está definido tanto en la clase Person como en la clase A, llamémoslo en la clase Male

class Person{ run() => print("person"); }

mixin A{ run() => print("A"); }

class Male extends Person with A{}

main(){
  Male().run();
}

El resultado es el siguiente:

-------------------------------------------------- -------------------------------------------------- ---

 

A

 Aquí solo se ejecuta el método run() en la clase A. En dart, hay una característica gramatical llamada linealización

 El código para el mixin anterior es equivalente a

Class PersonA = Person with A
Class Male extends PersonA;

 Es equivalente al método run() en la clase Person siendo reescrito por A, por lo que se llama al método run() reescrito en la clase A.

Entonces, ¿tenemos una forma de llamar al método en la clase Person? La respuesta es, por supuesto, sí, y es muy simple. Dado que es herencia, podemos llamar directamente al método principal, además de super.run()

class Person{ run() => print("person"); }

mixin A{
  @override
  run() {
    super.run();
    print("A");
  }
}

class Male extends Person with A{}

main(){
  Male().run();
}

La salida es:

person
A

en

Al usar mixin, puede usar la palabra clave on para restringir Al mezclar en esta clase, primero debe heredar o mezclar en la clase detrás de on

como:

class Person{ run() => print("person"); }

mixin A{ run() => print("A"); }

mixin C on Person{
  @override
  run() {
    super.run();
    print("C");
  }
}

//这里还可以是
//class Femal extends Person with A,C{}

class Female with A,Person,C{}  //混入时,Person类必须在C之前

main(){
  Female().run();
}

resultado final

person
C

referencia

Análisis de mezclas en dart - Attack on Summer's Blog - CSDN Blog - dart mixin

Comprensión profunda de Mixin en Dart - Se busca programador

Supongo que te gusta

Origin blog.csdn.net/TDSSS/article/details/129123887
Recomendado
Clasificación