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.
Desafío
FácilConstruyamos 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
Mediacon una propiedadString title, un constructor que recibe el título y un métodoplay()que imprimePlaying: [title] - Una clase
Songque extiendeMediay añade una propiedadString artist. Usa la anotación@overridey sobrescribeplay()para imprimirPlaying song: [title] by [artist] - Una clase
Videoque extiendeMediay añade una propiedadint duration(en segundos). Usa@overridey sobrescribeplay()para llamar primero a la versión de la clase principal consuper.play()y después imprimirDuration: [duration] seconds
- Una clase
main.dart: Importa tu archivo multimedia y demuestra los métodos sobrescritos:- Crea un objeto
Mediacon el título'Generic Content'y llama aplay() - Imprime una línea vacía
- Crea un
Songcon el título'Imagine'y el artista'John Lennon', después llama aplay() - Imprime una línea vacía
- Crea un
Videocon el título'Dart Tutorial'y una duración de360, después llama aplay()
- Crea un objeto
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 secondsPrué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()
}
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
1Fundamentos de POO
Archivos externosLibrerías e importacionesIntroducción a la POOClases vs. ObjetosLa palabra clave thisMétodosVariables de instanciaConceptos básicos de constructoresResumen - Calculadora sencilla4Seguridad de nulos
Introducción a la seguridad de nulosNulables vs No nulablesLos operadores ? y !Palabra clave Late y Null SafetyOperadores Null-awareNull Safety en clasesResumen - Sistema de perfil de usuario7Clases abstractas e interfaces
Clases abstractasMétodos abstractosInterfaces en DartInterfaces implícitasImplementar vs. ExtenderInterfaces múltiplesRepaso - Calculadora de figuras10Colecciones y Genéricos
Visión general de List, Set y MapColecciones con seguridad de tiposClases genéricasMétodos genéricosRestricciones genéricasIterable e IteratorResumen - Almacenamiento genérico2Constructores en Dart
Constructor por defectoConstructores nombradosListas de inicializaciónConstructores constantesConstructores de fábricaConstructores de redireccionamientoResumen - Constructor de formas5Encapsulamiento
Miembros públicos vs. privadosLa convención del prefijo _Privacidad a nivel de libreríaProfundidad en Getters y SettersOcultamiento de informaciónResumen - Registros de estudiantes8Mixins
Introducción a los MixinsCreación de MixinsUso de múltiples MixinsPalabra clave on en MixinsMixin vs HerenciaMixin vs InterfazResumen - Sistema Animal11Métodos especiales
Sobrescritura de toString()Sobrescritura de hashCode y ==Interfaz ComparableMétodo call()Sobrescritura de noSuchMethodResumen - Colección personalizada14Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy3Propiedades de clase
Miembros de instancia vs. estáticosCampos Final y ConstVariables LateMétodos y campos estáticosGetters y SettersResumen - Gestor de cuentas bancarias6Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosLa anotación @overrideLa palabra clave final en clasesConstructores y herenciaResumen - Jerarquía de empleados9Polimorfismo
Fundamentos del polimorfismoPolimorfismo mediante interfacesComprobación de tipos en tiempo de ejecuciónLos operadores is y asPalabra clave covariantResumen - Procesador de pagos12POO Asíncrona
Futures y async/awaitFundamentos de StreamsStream ControllersConstructores asíncronosAsincronía en métodos de claseRepaso - Data Fetcher15Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón RepositoryPractica por tu cuenta: Compilador de Dart online