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 parent. Esto permite que las subclases personalicen el comportamiento heredado mientras mantienen la misma firma del método.

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

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 ampliar, en lugar de reemplazar, el comportamiento de parent:

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 te permite basarte en una funcionalidad existente. La regla clave es sencilla: el mismo nombre de método y los mismos parámetros en la clase hija reemplazan la implementación de la clase padre cuando se llama en instancias de la clase hija.

challenge icon

Desafío

Fácil

Construyamos un sistema de notificaciones que demuestre cómo las clases hijas pueden sobrescribir métodos de las clases padre para personalizar el comportamiento. Crearás diferentes tipos de notificaciones que entregarán mensajes de su propia manera única.

Organizarás tu código en dos archivos:

  • notification.dart: Define aquí tu jerarquía de notificaciones:
    • Una clase Notification (la clase padre) con un String title y un String message. Incluye un constructor que reciba ambos valores y un método send() que imprima Notification: [title] - [message]
    • Una clase EmailNotification que extienda Notification y agregue una propiedad String recipient. Sobrescribe el método send() para imprimir Sending email to [recipient]: [title] - [message]
    • Una clase PushNotification que extienda Notification y agregue una propiedad String deviceId. Sobrescribe el método send() para llamar primero al método send() de la clase padre usando super y, después, imprimir Pushed to device: [deviceId] en la línea siguiente
  • 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 por completo el comportamiento de la clase padre, mientras que PushNotification lo extiende llamando primero a super.send(). Ambos enfoques son formas válidas de sobrescribir métodos, según 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

Pruébalo tú mismo

import 'notification.dart';

void main() {
  // TODO: Create a base Notification with title 'Alert' and message 'System update available'
  // Llama a su método send()

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

  // TODO: Crea un 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 un 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

Practica por tu cuenta: Compilador de Dart online