La palabra clave super
Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy — lección 37 de 110.
La palabra clave super le da a una clase hija acceso directo a su clase padre. Ya la has visto en constructores con super(name), pero también es útil en otros contextos.
Cuando necesites llamar al constructor del padre, super pasa los argumentos hacia arriba en la cadena de herencia:
class Vehicle {
String brand;
int year;
Vehicle(this.brand, this.year);
}
class Car extends Vehicle {
int doors;
Car(String brand, int year, this.doors) : super(brand, year);
}La palabra clave super también te permite acceder a los métodos y propiedades del padre desde la clase hija. Esto es especialmente útil cuando quieres usar el comportamiento del padre junto con el tuyo propio:
class Animal {
String name;
Animal(this.name);
void makeSound() {
print('$name makes a sound');
}
}
class Cat extends Animal {
Cat(String name) : super(name);
void makeSound() {
super.makeSound(); // Llama primero al método del padre
print('$name says meow!');
}
}Cuando llamas a super.makeSound(), estás invocando explícitamente la versión del método del padre. Sin super, llamar a makeSound() se referiría al método de la clase actual, lo que podría causar una recursión infinita.
Piensa en super como si dijera "usa la versión de mi padre", ya sea un constructor, un método o una propiedad.
Desafío
FácilVamos a construir un sistema de mensajería que demuestre cómo la palabra clave super permite que las clases hijas accedan y extiendan el comportamiento de su padre. Crearás una jerarquía donde diferentes tipos de mensajes se construyen a partir de una clase de mensaje base.
Organizarás tu código en dos archivos:
message.dart: Define tus clases de mensaje aquí:- Una clase
Message(el padre) con unString senderyString content. Incluye un constructor que tome ambos valores y un métododisplay()que imprimaFrom [sender]: [content] - Una clase
UrgentMessageque extiendaMessage. Debe tener una propiedad adicionalString priority. El constructor toma sender, content y priority, pasando los dos primeros al padre usandosuper. Sobrescribe el métododisplay()para llamar primero a la versión del padre usandosuper.display(), y luego imprimirPriority: [priority]en la siguiente línea
- Una clase
main.dart: Importa tu archivo de mensajes y demuestra cómo funcionasupertanto en constructores como en métodos:- Crea un
Messageregular de'Alice'con el contenido'Hello there!' - Llama a su método
display() - Imprime una línea vacía para separar
- Crea un
UrgentMessagede'Bob'con el contenido'Server is down!'y prioridad'HIGH' - Llama a su método
display()
- Crea un
Observa cómo UrgentMessage utiliza super de dos maneras: en el constructor para pasar datos al padre, y en el método sobrescrito para incluir la salida del padre antes de añadir la suya propia.
Salida esperada:
From Alice: Hello there!
From Bob: Server is down!
Priority: HIGHHoja de referencia
La palabra clave super proporciona acceso a una clase padre desde una clase hija.
Usa super() en el constructor de una clase hija para pasar argumentos al constructor del padre:
class Vehicle {
String brand;
int year;
Vehicle(this.brand, this.year);
}
class Car extends Vehicle {
int doors;
Car(String brand, int year, this.doors) : super(brand, year);
}Usa super para llamar a métodos del padre desde métodos sobrescritos:
class Animal {
String name;
Animal(this.name);
void makeSound() {
print('$name makes a sound');
}
}
class Cat extends Animal {
Cat(String name) : super(name);
void makeSound() {
super.makeSound(); // Call parent's method first
print('$name says meow!');
}
}Sin super, llamar directamente al nombre de un método hace referencia a la versión de la clase actual, lo que puede causar una recursión infinita en los métodos sobrescritos.
Pruébalo tú mismo
import 'message.dart';
void main() {
// TODO: Crea un Message regular de 'Alice' con el contenido 'Hello there!'
// TODO: Llama al método display() en el mensaje
// TODO: Imprime una línea vacía para separar
// TODO: Crea un UrgentMessage de 'Bob' con el contenido 'Server is down!' y prioridad 'HIGH'
// TODO: Llama al método display() en el mensaje urgente
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de POO
Archivos externosLibrerías e importacionesIntroducción a la POOClases vs. ObjetosLa palabra clave thisMétodosVariables de instanciaConceptos básicos de constructoresResumen - Calculadora sencilla4Seguridad de nulos
Introducción a la seguridad de nulosNulables vs No nulablesLos operadores ? y !Palabra clave Late y Null SafetyOperadores Null-awareNull Safety en clasesResumen - Sistema de perfil de usuario7Clases abstractas e interfaces
Clases abstractasMétodos abstractosInterfaces en DartInterfaces implícitasImplementar vs. ExtenderInterfaces múltiplesRepaso - Calculadora de figuras10Colecciones y Genéricos
Visión general de List, Set y MapColecciones con seguridad de tiposClases genéricasMétodos genéricosRestricciones genéricasIterable e IteratorResumen - Almacenamiento genérico2Constructores en Dart
Constructor por defectoConstructores nombradosListas de inicializaciónConstructores constantesConstructores de fábricaConstructores de redireccionamientoResumen - Constructor de formas5Encapsulamiento
Miembros públicos vs. privadosLa convención del prefijo _Privacidad a nivel de libreríaProfundidad en Getters y SettersOcultamiento de informaciónResumen - Registros de estudiantes8Mixins
Introducción a los MixinsCreación de MixinsUso de múltiples MixinsPalabra clave on en MixinsMixin vs HerenciaMixin vs InterfazResumen - Sistema Animal11Métodos especiales
Sobrescritura de toString()Sobrescritura de hashCode y ==Interfaz ComparableMétodo call()Sobrescritura de noSuchMethodResumen - Colección personalizada14Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy3Propiedades de clase
Miembros de instancia vs. estáticosCampos Final y ConstVariables LateMétodos y campos estáticosGetters y SettersResumen - Gestor de cuentas bancarias6Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosLa anotación @overrideLa palabra clave final en clasesConstructores y herenciaResumen - Jerarquía de empleados9Polimorfismo
Fundamentos del polimorfismoPolimorfismo mediante interfacesComprobación de tipos en tiempo de ejecuciónLos operadores is y asPalabra clave covariantResumen - Procesador de pagos12POO Asíncrona
Futures y async/awaitFundamentos de StreamsStream ControllersConstructores asíncronosAsincronía en métodos de claseRepaso - Data Fetcher15Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository