Menu
Coddy logo textTech

A Anotação @override

Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy — lição 39 de 110.

A anotação @override é um marcador de melhor prática que informa ao Dart (e a outros desenvolvedores) que você está substituindo intencionalmente um método de uma classe pai. Embora a sobrescrita de método funcione sem ela, usar @override adiciona uma importante rede de segurança.

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

A anotação fornece dois benefícios principais. Primeiro, ela documenta sua intenção de forma clara — qualquer pessoa que ler o código saberá imediatamente que este método existe na classe pai. Segundo, o analisador do Dart irá avisá-lo se o método pai não existir de fato, detectando erros de digitação e de refatoração precocemente.

Considere o que acontece se você escrever incorretamente o nome do método sem @override:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speek() {  // Erro de digitação! Nenhum aviso sem @override
    print('$name meows');
  }
}

Sem a anotação, o Dart assume que você está criando um novo método chamado speek(). Com @override, o analisador sinalizaria imediatamente que tal método não existe na classe pai. Esta anotação simples evita bugs sutis que podem ser difíceis de rastrear mais tarde.

challenge icon

Desafio

Fácil

Vamos construir um sistema de player de mídia que demonstra a importância da anotação @override ao personalizar o comportamento herdado. Você criará diferentes tipos de mídia, cada um reproduzindo conteúdo à sua maneira.

Você organizará seu código em dois arquivos:

  • media.dart: Defina sua hierarquia de mídia aqui:
    • Uma classe Media com uma propriedade String title, um construtor que recebe o título e um método play() que imprime Playing: [title]
    • Uma classe Song que estende Media e adiciona uma propriedade String artist. Use a anotação @override e sobrescreva play() para imprimir Playing song: [title] by [artist]
    • Uma classe Video que estende Media e adiciona uma propriedade int duration (em segundos). Use @override e sobrescreva play() para primeiro chamar a versão do pai com super.play(), e depois imprimir Duration: [duration] seconds
  • main.dart: Importe seu arquivo de mídia e demonstre os métodos sobrescritos:
    • Crie um objeto Media com o título 'Generic Content' e chame play()
    • Imprima uma linha vazia
    • Crie um Song com o título 'Imagine' e o artista 'John Lennon', depois chame play()
    • Imprima uma linha vazia
    • Crie um Video com o título 'Dart Tutorial' e a duração 360, depois chame play()

A anotação @override documenta sua intenção e ajuda a capturar erros. Se você acidentalmente escrevesse play() incorretamente como plya(), a anotação o alertaria que tal método não existe na classe pai.

Saída esperada:

Playing: Generic Content

Playing song: Imagine by John Lennon

Playing: Dart Tutorial
Duration: 360 seconds

Folha de consulta

A anotação @override marca métodos que intencionalmente substituem um método de uma classe pai. Embora opcional, ela oferece segurança e clareza.

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

Benefícios do @override:

  • Documenta a intenção - mostra que o método existe na classe pai
  • Captura erros - o analisador do Dart avisa se o método pai não existir, prevenindo erros de digitação

Sem o @override, erros de digitação criam novos métodos em vez de sinalizar erros:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speek() {  // Erro de digitação cria um novo método sem aviso
    print('$name meows');
  }
}

Você pode chamar a versão do pai usando super:

@override
void play() {
  super.play();  // Chama o método pai primeiro
  print('Additional behavior');
}

Experimente você mesmo

import 'media.dart';

void main() {
  // TODO: Criar um objeto Media com o título 'Generic Content' e chamar play()
  
  
  // TODO: Imprimir uma linha vazia
  
  
  // TODO: Criar um Song com o título 'Imagine' e o artista 'John Lennon', depois chamar play()
  
  
  // TODO: Imprimir uma linha vazia
  
  
  // TODO: Criar um Video com o título 'Dart Tutorial' e a duração 360, depois chamar play()
  
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos