Menu
Coddy logo textTech

La anotación @override

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy. Lección 39 de 110.

La anotación @override es un marcador de buenas prácticas que indica a Dart (y a otros desarrolladores) que estás reemplazando intencionadamente un method de una parent class. Aunque el reemplazo de method funciona sin ella, usar @override añade una importante red de seguridad.

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

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

La anotación ofrece dos beneficios clave. Primero, documenta claramente tu intención: cualquiera que lea el código sabe de inmediato que este método existe en la clase principal. Segundo, el analizador de Dart te advertirá si el método principal en realidad no existe, detectando errores tipográficos y fallos de refactorización desde el principio.

Considera qué sucede si escribes incorrectamente el nombre del método sin @override:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speek() {  // ¡Typo! Sin advertencia sin @override
    print('$name meows');
  }
}

Sin la anotación, Dart asume que estás creando un método nuevo llamado speek(). Con @override, el analizador señalaría inmediatamente que no existe ningún método con ese nombre en la clase principal. Esta sencilla anotación evita errores sutiles que pueden ser difíciles de rastrear más adelante.

challenge icon

Desafío

Fácil

Construyamos un sistema de reproducción multimedia que demuestre la importancia de la anotación @override al personalizar el comportamiento heredado. Crearás diferentes tipos de contenido multimedia, cada uno de los cuales reproducirá el contenido a su manera.

Organizarás tu código en dos archivos:

  • media.dart: Define aquí tu jerarquía multimedia:
    • Una clase Media con una propiedad String title, un constructor que recibe el título y un método play() que imprime Playing: [title]
    • Una clase Song que extiende Media y añade una propiedad String artist. Usa la anotación @override y sobrescribe play() para imprimir Playing song: [title] by [artist]
    • Una clase Video que extiende Media y añade una propiedad int duration (en segundos). Usa @override y sobrescribe play() para llamar primero a la versión de la clase principal con super.play() y después imprimir Duration: [duration] seconds
  • main.dart: Importa tu archivo multimedia y demuestra los métodos sobrescritos:
    • Crea un objeto Media con el título 'Generic Content' y llama a play()
    • Imprime una línea vacía
    • Crea un Song con el título 'Imagine' y el artista 'John Lennon', después llama a play()
    • Imprime una línea vacía
    • Crea un Video con el título 'Dart Tutorial' y una duración de 360, después llama a play()

La anotación @override documenta tu intención y ayuda a detectar errores. Si escribieras accidentalmente play() como plya(), la anotación te avisaría de que no existe tal método en la clase principal.

Salida esperada:

Playing: Generic Content

Playing song: Imagine by John Lennon

Playing: Dart Tutorial
Duration: 360 seconds

Pruébalo tú mismo

import 'media.dart';

void main() {
  // TODO: Create a Media object with title 'Generic Content' and call play()
  
  
  // TODO: Imprime una línea vacía
  
  
  // TODO: Crea un Song con título 'Imagine' y artista 'John Lennon', luego llama a play()
  
  
  // TODO: Imprime una línea vacía
  
  
  // TODO: Create a Video with title 'Dart Tutorial' and duration 360, then call play()
  
}
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