Menu
Coddy logo textTech

A Palavra-chave super

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

A palavra-chave super dá a uma classe filha acesso direto à sua classe pai. Você já a viu em construtores com super(name), mas ela também é útil em outros contextos.

Quando você precisa chamar o construtor da classe pai, o super passa argumentos para cima na cadeia de herança:

class Vehicle {
  String brand;
  int year;
  
  Vehicle(this.brand, this.year);
}

class Car extends Vehicle {
  int doors;
  
  Car(String brand, int year, this.doors) : super(brand, year);
}

A palavra-chave super também permite acessar métodos e propriedades da classe pai de dentro da classe filha. Isso é especialmente útil quando você deseja usar o comportamento da classe pai junto com o seu próprio:

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

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void makeSound() {
    super.makeSound();  // Chama o método do pai primeiro
    print('$name says meow!');
  }
}

Quando você chama super.makeSound(), você está invocando explicitamente a versão do método da classe pai. Sem super, chamar makeSound() se referiria ao método da classe atual, potencialmente causando recursão infinita.

Pense no super como se estivesse dizendo "use a versão da minha classe pai" - seja ela um construtor, método ou propriedade.

challenge icon

Desafio

Fácil

Vamos construir um sistema de mensagens que demonstra como a palavra-chave super permite que as classes filhas acessem e estendam o comportamento de seus pais. Você criará uma hierarquia onde diferentes tipos de mensagens são construídos a partir de uma classe de mensagem base.

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

  • message.dart: Defina suas classes de mensagem aqui:
    • Uma classe Message (a mãe) com um String sender e String content. Inclua um construtor que receba ambos os valores e um método display() que imprima From [sender]: [content]
    • Uma classe UrgentMessage que estende Message. Ela deve ter uma propriedade adicional String priority. O construtor recebe sender, content e priority, passando os dois primeiros para a classe pai usando super. Sobrescreva o método display() para primeiro chamar a versão do pai usando super.display(), e depois imprimir Priority: [priority] na linha seguinte
  • main.dart: Importe seu arquivo de mensagem e demonstre como o super funciona tanto em construtores quanto em métodos:
    • Crie uma Message regular de 'Alice' com o conteúdo 'Hello there!'
    • Chame seu método display()
    • Imprima uma linha vazia para separação
    • Crie uma UrgentMessage de 'Bob' com o conteúdo 'Server is down!' e prioridade 'HIGH'
    • Chame seu método display()

Observe como UrgentMessage usa super de duas maneiras: no construtor para passar dados para o pai, e no método sobrescrito para incluir a saída do pai antes de adicionar a sua própria.

Saída esperada:

From Alice: Hello there!

From Bob: Server is down!
Priority: HIGH

Folha de consulta

A palavra-chave super fornece acesso a uma classe pai a partir de uma classe filha.

Use super() no construtor de uma classe filha para passar argumentos para o construtor pai:

class Vehicle {
  String brand;
  int year;
  
  Vehicle(this.brand, this.year);
}

class Car extends Vehicle {
  int doors;
  
  Car(String brand, int year, this.doors) : super(brand, year);
}

Use super para chamar métodos do pai de dentro de métodos sobrescritos:

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

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void makeSound() {
    super.makeSound();  // Call parent's method first
    print('$name says meow!');
  }
}

Sem o super, chamar o nome de um método refere-se diretamente à versão da classe atual, o que pode causar recursão infinita em métodos sobrescritos.

Experimente você mesmo

import 'message.dart';

void main() {
  // TODO: Crie uma Message regular de 'Alice' com o conteúdo 'Hello there!'
  
  // TODO: Chame o método display() na mensagem
  
  // TODO: Imprima uma linha vazia para separação
  
  // TODO: Crie uma UrgentMessage de 'Bob' com o conteúdo 'Server is down!' e prioridade 'HIGH'
  
  // TODO: Chame o método display() na mensagem urgente
}
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