Menu
Coddy logo textTech

Classes genéricas

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

Você viu como as coleções integradas do Dart, como List<String>, usam parâmetros de tipo. Agora é hora de criar suas próprias classes genéricas que funcionem com qualquer tipo que você especificar.

Uma classe genérica usa um parâmetro de tipo (normalmente T) como um espaço reservado para o tipo real que será fornecido ao criar uma instância:

class Box<T> {
  T content;
  
  Box(this.content);
  
  T getContent() => content;
}

void main() {
  var stringBox = Box<String>('Hello');
  var intBox = Box<int>(42);
  
  print(stringBox.getContent());  // Hello
  print(intBox.getContent());     // 42
}

O T atua como uma variável de tipo — quando você cria Box<String>, cada T na classe se torna String. Isso proporciona segurança de tipos sem que você precise escrever classes separadas para cada tipo.

Você pode usar vários parâmetros de tipo quando sua classe precisa trabalhar com mais de um tipo:

class Pair<K, V> {
  K first;
  V second;
  
  Pair(this.first, this.second);
}

void main() {
  var pair = Pair<String, int>('age', 25);
  print('${pair.first}: ${pair.second}');  // age: 25
}

Classes genéricas são a base de um código reutilizável e com segurança de tipos. Em vez de duplicar a lógica para diferentes tipos ou perder informações de tipo com dynamic, os genéricos permitem escrever um código flexível que o compilador ainda pode verificar.

challenge icon

Desafio

Fácil

Vamos criar um sistema de embrulho de presentes que usa classes genéricas para criar contêineres flexíveis para diferentes tipos de itens. Você criará uma classe genérica Wrapper que pode envolver qualquer tipo de conteúdo e uma classe GiftBox com dois parâmetros de tipo para associar um presente a uma mensagem de cartão.

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

  • wrapper.dart: Defina suas classes genéricas aqui:
    • Uma classe genérica Wrapper<T> com uma propriedade T content e um construtor. Inclua um método unwrap() que retorna o conteúdo e um método describe() que imprime Wrapped: [content]
    • Uma classe genérica GiftBox<G, C> com duas propriedades: G gift e C card. Inclua um construtor e um método open() que imprime Gift: [gift] em uma linha e Card: [card] na linha seguinte
  • main.dart: Importe seu arquivo de wrapper e demonstre as classes genéricas com diferentes tipos:
    • Crie um Wrapper<String> contendo 'Chocolate' e chame describe()
    • Crie um Wrapper<int> contendo 42 e chame describe()
    • Crie um Wrapper<double> contendo 3.14 e chame describe()
    • Imprima uma linha vazia
    • Crie um GiftBox<String, String> com o presente 'Teddy Bear' e o cartão 'Happy Birthday!' e, em seguida, chame open()
    • Imprima uma linha vazia
    • Crie um GiftBox<int, String> com o presente 100 (representando o valor de um cartão-presente) e o cartão 'Congratulations!' e, em seguida, chame open()

Observe como a mesma classe Wrapper funciona perfeitamente com strings, inteiros e números de ponto flutuante. A classe GiftBox demonstra o uso de dois parâmetros de tipo para associar diferentes tipos — o presente pode ser de qualquer tipo, enquanto a mensagem do cartão permanece uma string.

Saída esperada:

Wrapped: Chocolate
Wrapped: 42
Wrapped: 3.14

Gift: Teddy Bear
Card: Happy Birthday!

Gift: 100
Card: Congratulations!

Experimente você mesmo

import 'wrapper.dart';

void main() {
  // TODO: Crie um Wrapper<String> contendo 'Chocolate' e chame describe()
  
  // TODO: Crie um Wrapper<int> contendo 42 e chame describe()
  
  // TODO: Crie um Wrapper<double> contendo 3.14 e chame describe()
  
  // TODO: Imprima uma linha vazia
  
  // TODO: Create a GiftBox<String, String> with gift 'Teddy Bear' 
  // and card 'Happy Birthday!', then call open()
  
  // TODO: Imprima uma linha vazia
  
  // TODO: Crie um GiftBox<int, String> com gift 100 
  // and card 'Congratulations!', then call open()
}
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