Herencia de clases y sobrescritura de miembros

Extender una clase Extend a class

Utiliza la palabra clave extends para generar una subclase a partir de una superclase (clase padre).

Emplea la palabra clave super para invocar miembros de la clase padre (métodos, constructores, etc.) desde dentro de la subclase.

class Television {
  void turnOn() {
     ...
     // Código que se ejecuta dentro del método de la clase padre
  }
}

// SmartTelevision es la subclase, Television es la superclase
class SmartTelevision extends Television {
  @override
  void turnOn() {
    super.turnOn(); // Llama al método turnOn de la clase padre
    // Código exclusivo de la subclase
    ...
  }
}Lenguaje del código: Dart (dart)

Por ejemplo, el televisor tradicional actúa como clase padre y el televisor inteligente como subclase; el televisor inteligente hereda las funcionalidades del televisor tradicional.

extends tiene otro escenario de uso: los contenidos relacionados con los tipos parametrizados del capítulo de genéricos.

Ejemplo práctico
class Television {
  void turnOn() {
    print("Encender televisor, activar salida de imagen básica");
  }
}

// SmartTelevision es la subclase, Television es la superclase
class SmartTelevision extends Television {
  @override
  void turnOn() {
    super.turnOn(); // Llama al método turnOn de la clase padre
    // Código exclusivo de la subclase
    print("Televisor inteligente: activar módulo de red, cargar pantalla principal del sistema inteligente");
  }
}

void main() {
  // Instancia de televisor común
  Television normalTv = Television();
  print("===== Encender televisor común =====");
  normalTv.turnOn();

  // Instancia de televisor inteligente
  SmartTelevision smartTv = SmartTelevision();
  print("\n===== Encender televisor inteligente =====");
  smartTv.turnOn();
}Lenguaje del código: Dart (dart)

Resultado de ejecución

D:\dartdemo\firstdart>dart run
Building package executable... (1.4s)
Built firstdart:firstdart.
===== Encender televisor común =====
Encender televisor, activar salida de imagen básica

===== Encender televisor inteligente =====
Encender televisor, activar salida de imagen básica

Sobreescritura de miembros Overriding members

1. Elementos que se pueden sobrescribir

La subclase puede sobrescribir: métodos de instancia (incluidos operadores), getters y setters.

2. La anotación @override

Propósito: declarar explícitamente que este método sobrescribe deliberadamente un miembro de la clase padre, permitiendo que el compilador realice comprobaciones.

class Television {
  set contrast(int value) {}
}

class SmartTelevision extends Television {
  @override // Informa al compilador que este método sobrescribe el de la clase padre
  set contrast(num value) {}
}
Lenguaje del código: JavaScript (javascript)

3. Reglas obligatorias para la sobrescritura

  1. Tipo de retorno: El tipo de retorno del método sobrescrito debe coincidir con el del método padre o ser un subtipo de él.
  2. Tipo de parámetros: El tipo de parámetro del método sobrescrito debe coincidir con el de la clase padre o ser un supertipo. (Ejemplo: intnum. num es supertipo de int y es válido.)
  3. Cantidad de parámetros posicionales: Si el método original tiene n parámetros posicionales, el método sobrescrito también debe declarar n parámetros posicionales.
  4. Restricciones genéricas: Un método genérico no puede sobrescribir un método no genérico y viceversa.

4. Palabra clave covariant (caso especial de reducción de tipos)

Las reglas estándar prohíben reducir el tipo de parámetro (la conversión descendente puede generar errores de tipo en tiempo de ejecución) ;

Si el desarrollador garantiza que no habrá errores de tipo, marca el parámetro con covariant para habilitar la reducción de tipo de parámetro.

Cuando sobrescribas el operador ==, tienes que sobrescribir también obligatoriamente el getter hashCode de Object.


noSuchMethod ()

1. Propósito

Cuando el código intenta invocar un método de instancia / variable de instancia inexistente, puedes sobrescribir noSuchMethod() para interceptar la llamada y definir un comportamiento personalizado.

Si no se sobrescribe, el acceso a miembros inexistentes lanzará directamente NoSuchMethodError.

class A {
  @override
  void noSuchMethod(Invocation invocation) {
    print('You tried to use a non-existent member: ${invocation.memberName}');
  }
}
Lenguaje del código: JavaScript (javascript)
  • Objeto Invocation: Almacena toda la información de la invocación (nombre del miembro, parámetros, etc.)
2. Dos requisitos para invocar métodos no implementados (cumplir uno)
  1. El tipo estático del receptor de la llamada es dynamic ;
  2. El tipo estático del receptor declara ese método no implementado (puede ser abstracto), y el tipo dinámico del receptor tiene una implementación de noSuchMethod() distinta a la versión nativa de Object.

Ejemplo

class A {
  @override
  void noSuchMethod(Invocation invocation) {
    print('You tried to use a non-existent member: ${invocation.memberName}');
    // Imprime parámetros y tipo de llamada para mostrar toda la información
    print('Parámetros de llamada:${invocation.arguments}');
    print('Tipo de invocación:${invocation.runtimeType}');
  }
}

void main() {
  A obj = A();
  // Llamada a método inexistente, activa noSuchMethod
  obj.hello("test", 123);
  // Acceso a propiedad inexistente
  obj.unknownValue;
}Lenguaje del código: Dart (dart)
D:\dartdemo\firstdart>dart run
Building package executable...
Failed to build firstdart:firstdart:
bin/firstdart.dart:6:30: Error: The getter 'arguments' isn't defined for the type 'Invocation'.
 - 'Invocation' is from 'dart:core'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'arguments'.
    print('cal:${invocation.arguments}');
                             ^^^^^^^^^
bin/firstdart.dart:14:7: Error: The method 'hello' isn't defined for the type 'A'.
 - 'A' is from 'bin/firstdart.dart'.
Try correcting the name to the name of an existing method, or defining a method named 'hello'.
  obj.hello("test", 123);
      ^^^^^
bin/firstdart.dart:16:7: Error: The getter 'unknownValue' isn't defined for the type 'A'.
 - 'A' is from 'bin/firstdart.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'unknownValue'.
  obj.unknownValue;Lenguaje del código: PHP (php)

Herencia de clases y sobrescritura de miembros

Next:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *