Menu
Coddy logo textTech

Sobrescritura de métodos

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy — lección 38 de 110.

La sobrescritura de métodos ocurre cuando una clase hija proporciona su propia implementación de un método que ya existe en la clase padre. Esto permite que las subclases personalicen el comportamiento heredado manteniendo la misma firma del método.

Cuando defines un método en una clase hija con el mismo nombre y parámetros que uno en la clase padre, la versión de la clase hija prevalece:

class Animal {
  String name;
  
  Animal(this.name);
  
  void speak() {
    print('$name makes a sound');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  void speak() {
    print('$name barks: Woof!');
  }
}

void main() {
  var animal = Animal('Generic');
  var dog = Dog('Buddy');
  
  animal.speak();  // Generic hace un sonido
  dog.speak();     // Buddy ladra: ¡Guau!
}

Cuando llamas a speak() en una instancia de Dog, Dart ejecuta la versión de Dog, no la de Animal. La clase hija ha sobrescrito el método de la clase padre.

También puedes combinar la sobrescritura con super para extender en lugar de reemplazar el comportamiento del padre:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speak() {
    super.speak();  // Llama primero a la versión del padre
    print('$name also purrs');
  }
}

Este patrón permite construir sobre la funcionalidad existente. La regla clave es simple: el mismo nombre de método y parámetros en la clase hija reemplaza la implementación del padre cuando se llama en instancias de la hija.

challenge icon

Desafío

Fácil

Vamos a construir un sistema de notificaciones que demuestre cómo las clases hijas pueden sobrescribir los métodos de los padres para personalizar el comportamiento. Crearás diferentes tipos de notificaciones que entregan mensajes de su propia manera única.

Organizarás tu código en dos archivos:

  • notification.dart: Define tu jerarquía de notificaciones aquí:
    • Una clase Notification (el padre) con un String title y String message. Incluye un constructor que tome ambos valores y un método send() que imprima Notification: [title] - [message]
    • Una clase EmailNotification que extienda Notification y añada una propiedad String recipient. Sobrescribe el método send() para imprimir Sending email to [recipient]: [title] - [message]
    • Una clase PushNotification que extienda Notification y añada una propiedad String deviceId. Sobrescribe el método send() para llamar primero al send() del padre usando super, luego imprime Pushed to device: [deviceId] en la siguiente línea
  • main.dart: Importa tu archivo de notificaciones y demuestra la sobrescritura de métodos en acción:
    • Crea una Notification base con el título 'Alert' y el mensaje 'System update available'
    • Llama a su método send()
    • Imprime una línea vacía
    • Crea una EmailNotification con el título 'Welcome', el mensaje 'Thanks for signing up!', y el destinatario 'user@example.com'
    • Llama a su método send()
    • Imprime una línea vacía
    • Crea una PushNotification con el título 'Reminder', el mensaje 'Meeting in 10 minutes', y el deviceId 'DEVICE-001'
    • Llama a su método send()

Observa cómo EmailNotification reemplaza completamente el comportamiento del padre, mientras que PushNotification lo extiende llamando primero a super.send(). Ambos enfoques son formas válidas de sobrescribir métodos dependiendo de tus necesidades.

Salida esperada:

Notification: Alert - System update available

Sending email to user@example.com: Welcome - Thanks for signing up!

Notification: Reminder - Meeting in 10 minutes
Pushed to device: DEVICE-001

Hoja de referencia

La sobrescritura de métodos ocurre cuando una clase hija proporciona su propia implementación de un método que ya existe en la clase padre. La versión de la hija reemplaza a la del padre cuando se llama en instancias de la hija.

Para sobrescribir un método, defínalo en la clase hija con el mismo nombre y parámetros:

class Animal {
  String name;
  
  Animal(this.name);
  
  void speak() {
    print('$name makes a sound');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  void speak() {
    print('$name barks: Woof!');
  }
}

void main() {
  var animal = Animal('Generic');
  var dog = Dog('Buddy');
  
  animal.speak();  // Generic hace un sonido
  dog.speak();     // Buddy ladra: ¡Guau!
}

Puede usar super para llamar a la versión del padre y extender el comportamiento en lugar de reemplazarlo:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speak() {
    super.speak();  // Llamar primero a la versión del padre
    print('$name also purrs');
  }
}

Pruébalo tú mismo

import 'notification.dart';

void main() {
  // TODO: Crea una Notification base con title 'Alert' y message 'System update available'
  // Llama a su método send()

  // TODO: Imprime una línea vacía

  // TODO: Crea una EmailNotification con:
  // - title: 'Welcome'
  // - message: 'Thanks for signing up!'
  // - recipient: 'user@example.com'
  // Llama a su método send()

  // TODO: Imprime una línea vacía

  // TODO: Crea una PushNotification con:
  // - title: 'Reminder'
  // - message: 'Meeting in 10 minutes'
  // - deviceId: 'DEVICE-001'
  // Llama a su método send()
}
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