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 mejores prácticas que le indica a Dart (y a otros desarrolladores) que estás reemplazando intencionalmente un método de una clase padre. Aunque la sobrescritura de métodos funciona sin ella, usar @override añade una red de seguridad importante.

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 proporciona dos beneficios clave. Primero, documenta tu intención claramente: cualquier persona que lea el código sabrá de inmediato que este método existe en la clase padre. Segundo, el analizador de Dart te advertirá si el método padre no existe realmente, detectando errores tipográficos y errores de refactorización a tiempo.

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

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

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

challenge icon

Desafío

Fácil

Vamos a construir un sistema de reproductor de medios que demuestre la importancia de la anotación @override al personalizar el comportamiento heredado. Crearás diferentes tipos de medios que cada uno reproduce contenido a su propia manera.

Organizarás tu código en dos archivos:

  • media.dart: Define tu jerarquía de medios aquí:
    • 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 de 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 de Media y añade una propiedad int duration (en segundos). Usa @override y sobrescribe play() para llamar primero a la versión del padre con super.play(), y luego imprimir Duration: [duration] seconds
  • main.dart: Importa tu archivo de medios 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', luego llama a play()
    • Imprime una línea vacía
    • Crea un Video con el título 'Dart Tutorial' y la duración 360, luego llama a play()

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

Salida esperada:

Playing: Generic Content

Playing song: Imagine by John Lennon

Playing: Dart Tutorial
Duration: 360 seconds

Hoja de referencia

La anotación @override marca los métodos que reemplazan intencionalmente un método de la clase padre. Aunque es opcional, proporciona seguridad y claridad.

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!');
  }
}

Beneficios de @override:

  • Documenta la intención: muestra que el método existe en la clase padre
  • Detecta errores: el analizador de Dart advierte si el método padre no existe, evitando errores de escritura

Sin @override, los errores de escritura crean nuevos métodos en lugar de señalar errores:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speek() {  // El error de escritura crea un nuevo método sin previo aviso
    print('$name meows');
  }
}

Puedes llamar a la versión del padre usando super:

@override
void play() {
  super.play();  // Llama primero al método padre
  print('Additional behavior');
}

Pruébalo tú mismo

import 'media.dart';

void main() {
  // TODO: Crear un objeto Media con el título 'Generic Content' y llamar a play()
  
  
  // TODO: Imprimir una línea vacía
  
  
  // TODO: Crear un Song con el título 'Imagine' y el artista 'John Lennon', luego llamar a play()
  
  
  // TODO: Imprimir una línea vacía
  
  
  // TODO: Crear un Video con el título 'Dart Tutorial' y la duración 360, luego llamar a 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