Menu
Coddy logo textTech

Herança Básica

Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy. Lição 36 de 110.

Herança permite que uma classe adquira as propriedades e métodos de outra classe. Em vez de reescrever o mesmo código, você cria uma nova classe que se baseia em uma já existente. A classe original é chamada de pai (ou superclasse), e a nova classe é a filha (ou subclasse).

Em Dart, você usa a palavra-chave extends para herdar de uma classe pai:

class Animal {
  String name;
  
  Animal(this.name);
  
  void eat() {
    print('$name is eating');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  void bark() {
    print('$name says woof!');
  }
}

void main() {
  var dog = Dog('Buddy');
  dog.eat();   // Herdado de Animal
  dog.bark();  // Definido em Dog
}

A classe Dog tem automaticamente acesso à propriedade name e ao método eat() de Animal, além de seu próprio método bark(). Isso cria uma relação de “é um” — um Dog é um Animal.

A classe filha pode adicionar novas propriedades e métodos, mas herda tudo o que é público da classe pai. Observe que membros privados (aqueles com _) não são acessíveis diretamente em subclasses de bibliotecas diferentes, embora ainda existam no objeto herdado.

challenge icon

Desafio

Fácil

Vamos criar um sistema de veículos que demonstra como a herança permite que classes filhas reutilizem e estendam a funcionalidade da classe pai. Você criará uma classe pai para veículos em geral e uma classe filha para um tipo específico de veículo.

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

  • vehicle.dart: Defina suas classes aqui:
    • Uma classe Vehicle (a classe pai) com uma propriedade String brand, um construtor que recebe a marca e um método start() que imprime [brand] engine starting...
    • Uma classe Motorcycle que estende Vehicle. Ela deve ter uma propriedade adicional int cc (cilindrada do motor), um construtor que recebe a marca e a cilindrada (passando a marca para a classe pai usando super) e seu próprio método wheelie() que imprime [brand] is doing a wheelie!
  • main.dart: Importe seu arquivo de veículos e demonstre a herança em ação:
    • Crie um Vehicle com a marca 'Toyota'
    • Chame seu método start()
    • Crie uma Motorcycle com a marca 'Harley' e cilindrada 1200
    • Chame o método start() da motocicleta (herdado de Vehicle)
    • Chame o método wheelie() da motocicleta (definido em Motorcycle)
    • Imprima Motorcycle engine: [cc]cc para mostrar a própria propriedade da classe filha

Observe como a classe Motorcycle automaticamente obtém acesso à propriedade brand e ao método start() de Vehicle, além de ter sua própria propriedade exclusiva cc e seu próprio método wheelie(). Esse é o poder da herança: construir sobre um código existente.

Saída esperada:

Toyota engine starting...
Harley engine starting...
Harley is doing a wheelie!
Motorcycle engine: 1200cc

Experimente você mesmo

import 'vehicle.dart';

void main() {
  // TODO: Criar um Vehicle com a marca 'Toyota'
  
  // TODO: Chamar o método start() do veículo
  
  // TODO: Criar uma Motorcycle com a marca 'Harley' e cc 1200
  
  // TODO: Chamar o método start() da motocicleta (herdado de Vehicle)
  
  // TODO: Chamar o método wheelie() da motocicleta
  
  // TODO: Imprimir 'Motorcycle engine: [cc]cc' usando a propriedade cc da motocicleta
}
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