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 boa 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étodos funcione sem ela, usar @override adiciona uma importante camada 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 annotation oferece dois benefícios importantes. Primeiro, documenta claramente sua intenção — qualquer pessoa que leia o código sabe imediatamente que esse method existe na parent class. Segundo, o analisador do Dart avisará se o método do parent não existir de fato, identificando erros de digitação e problemas de refatoração logo no início.

Considere o que acontece se você escrever o nome do método incorretamente 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 presume que você está criando um novo método chamado speek(). Com @override, o analisador sinalizaria imediatamente que esse método não existe na classe pai. Essa simples anotação evita bugs sutis que podem ser difíceis de rastrear posteriormente.

challenge icon

Desafio

Fácil

Vamos criar um sistema de reprodutor 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 própria 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 substitua 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 substitua play() para primeiro chamar a versão da classe pai com super.play() e, em seguida, imprimir Duration: [duration] seconds
  • main.dart: Importe seu arquivo de mídia e demonstre os métodos substituídos:
    • 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 detectar erros. Se você acidentalmente escrevesse play() incorretamente como plya(), a anotação alertaria que não existe tal método na classe pai.

Saída esperada:

Playing: Generic Content

Playing song: Imagine by John Lennon

Playing: Dart Tutorial
Duration: 360 seconds

Experimente você mesmo

import 'media.dart';

void main() {
  // TODO: Create a Media object with title 'Generic Content' and call play()
  
  
  // TODO: Imprima uma linha vazia
  
  
  // TODO: Crie um Song com o título 'Imagine' e o artista 'John Lennon', depois chame play()
  
  
  // TODO: Imprima uma linha vazia
  
  
  // TODO: Create a Video with title 'Dart Tutorial' and duration 360, then call 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

Pratique por conta própria: Compilador de Dart online