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 necesitas llamar al constructor de la clase padre, super pasa los argumentos por 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 dijeras «usa la versión de mi clase padre», ya sea un constructor, un método o una propiedad.

challenge icon

Desafío

Fácil

Construyamos un sistema de mensajería que demuestre cómo la palabra clave super permite que las clases hijas accedan al comportamiento de su clase padre y lo amplíen. Crearás una jerarquía en la que distintos tipos de mensajes se basan en una clase de mensaje base.

Organizarás tu código en dos archivos:

  • message.dart: Define aquí tus clases de mensajes:
    • Una clase Message (la clase padre) con un String sender y un String content. Incluye un constructor que reciba 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 recibe sender, content y priority, y pasa los dos primeros a la clase padre mediante super. Sobrescribe el método display() para llamar primero a la versión de la clase padre mediante super.display() y después imprimir Priority: [priority] en la línea siguiente
  • main.dart: Importa tu archivo de mensajes y demuestra cómo funciona super tanto en constructores como en métodos:
    • Crea un Message normal de 'Alice' con el contenido 'Hello there!'
    • Llama a su método display()
    • Imprime una línea vacía como separación
    • Crea un UrgentMessage de 'Bob' con el contenido 'Server is down!' y la prioridad 'HIGH'
    • Llama a su método display()

Observa cómo UrgentMessage usa super de dos maneras: en el constructor para pasar datos a la clase padre y en el método sobrescrito para incluir la salida de la clase padre antes de añadir la suya.

Salida esperada:

From Alice: Hello there!

From Bob: Server is down!
Priority: HIGH

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

Practica por tu cuenta: Compilador de Dart online