Menu
Coddy logo textTech

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.

challenge icon

Desafío

Fácil

Vamos 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 un String sender y String content. Incluye un constructor que tome ambos valores y un método display() que imprima From [sender]: [content]
    • Una clase UrgentMessage que extienda Message. Debe tener una propiedad adicional String priority. El constructor toma sender, content y priority, pasando los dos primeros al padre usando super. Sobrescribe el método display() para llamar primero a la versión del padre usando super.display(), y luego imprimir Priority: [priority] en la siguiente línea
  • main.dart: Importa tu archivo de mensajes y demuestra cómo funciona super tanto en constructores como en métodos:
    • Crea un Message regular de 'Alice' con el contenido 'Hello there!'
    • Llama a su método display()
    • Imprime una línea vacía para separar
    • Crea un UrgentMessage de 'Bob' con el contenido 'Server is down!' y prioridad 'HIGH'
    • Llama a su método display()

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: HIGH

Hoja 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
}
quiz iconPonte a prueba

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