Menu
Coddy logo textTech

Classes Abstratas

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

Uma classe abstrata é uma classe que não pode ser instanciada diretamente. Ela serve como um modelo para outras classes, definindo uma estrutura comum que as subclasses devem seguir. Você cria uma usando a palavra-chave abstract.

abstract class Shape {
  String color;
  
  Shape(this.color);
  
  void describe() {
    print('A $color shape');
  }
}

class Circle extends Shape {
  double radius;
  
  Circle(String color, this.radius) : super(color);
}

void main() {
  // Shape s = Shape('red');  // Erro! Não é possível instanciar uma classe abstrata
  var circle = Circle('blue', 5.0);
  circle.describe();  // Uma forma azul
}

Classes abstratas são úteis quando você tem um conceito que é geral demais para existir por si só. Uma "Shape" é uma ideia, mas você não pode desenhar uma forma sem saber se ela é um círculo, retângulo ou triângulo. A classe abstrata define o que todas as formas têm em comum, enquanto as subclasses concretas fornecem os detalhes específicos.

Observe que classes abstratas ainda podem ter métodos regulares com implementações (como describe()) e construtores. As subclasses herdam esses elementos exatamente como na herança normal. A principal diferença é simplesmente que você não pode criar uma instância da própria classe abstrata - você deve usar uma subclasse concreta.

challenge icon

Desafio

Fácil

Vamos construir um sistema de veículos que demonstra como classes abstratas servem como modelos para tipos mais específicos. Você criará uma classe base abstrata que define o que todos os veículos têm em comum e, em seguida, a estenderá com tipos de veículos concretos.

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

  • vehicle.dart: Defina sua hierarquia de veículos aqui:
    • Uma abstract class Vehicle com uma propriedade String brand e uma int year. Inclua um construtor que receba ambos os valores e um método displayInfo() que imprima [brand] ([year])
    • Uma classe Car que estende Vehicle e adiciona uma propriedade int doors. Inclua um método honk() que imprima Beep beep!
    • Uma classe Motorcycle que estende Vehicle e adiciona uma propriedade bool hasSidecar. Inclua um método revEngine() que imprima Vroom!
  • main.dart: Importe seu arquivo de veículo e demonstre como as classes abstratas funcionam:
    • Crie um Car com a marca 'Toyota', ano 2022 e portas 4
    • Chame seu método displayInfo() (herdado de Vehicle)
    • Imprima Doors: [doors]
    • Chame seu método honk()
    • Imprima uma linha vazia
    • Crie uma Motorcycle com a marca 'Harley', ano 2021 e hasSidecar false
    • Chame seu método displayInfo()
    • Imprima Has sidecar: [hasSidecar]
    • Chame seu método revEngine()

Lembre-se de que você não pode criar uma instância de Vehicle diretamente, pois ela é abstrata - você deve usar uma das subclasses concretas. Tanto Car quanto Motorcycle herdam o método displayInfo() da classe pai abstrata.

Saída esperada:

Toyota (2022)
Doors: 4
Beep beep!

Harley (2021)
Has sidecar: false
Vroom!

Folha de consulta

Uma classe abstrata é uma classe que não pode ser instanciada diretamente. Ela serve como um modelo para outras classes, definindo uma estrutura comum que as subclasses devem seguir. Crie uma usando a palavra-chave abstract:

abstract class Shape {
  String color;
  
  Shape(this.color);
  
  void describe() {
    print('A $color shape');
  }
}

class Circle extends Shape {
  double radius;
  
  Circle(String color, this.radius) : super(color);
}

void main() {
  // Shape s = Shape('red');  // Erro! Não é possível instanciar uma classe abstrata
  var circle = Circle('blue', 5.0);
  circle.describe();  // A blue shape
}

Classes abstratas podem ter:

  • Métodos regulares com implementações
  • Construtores
  • Propriedades

As subclasses herdam esses membros assim como na herança normal. A principal diferença é que você não pode criar uma instância da própria classe abstrata - você deve usar uma subclasse concreta.

Experimente você mesmo

import 'vehicle.dart';

void main() {
  // TODO: Criar um Car com brand 'Toyota', year 2022, e doors 4
  
  // TODO: Chamar displayInfo() no carro
  
  // TODO: Imprimir "Doors: [doors]"
  
  // TODO: Chamar honk() no carro
  
  // TODO: Imprimir uma linha vazia
  
  // TODO: Criar uma Motorcycle com brand 'Harley', year 2021, e hasSidecar false
  
  // TODO: Chamar displayInfo() na motocicleta
  
  // TODO: Imprimir "Has sidecar: [hasSidecar]"
  
  // TODO: Chamar revEngine() na 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