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
- 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.
- 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:
int→num. num es supertipo de int y es válido.) - 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.
- 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)
- El tipo estático del receptor de la llamada es
dynamic; - 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 deObject.
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