Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Faça como eu fiz: Polimorfismo e Sobrescrita

Código-fonte do projeto:

void main() {
  Fruta laranja1 = Fruta('laranja', 'amarela', 30.5, 'amarga', 20);
  Citrica limao1 = Citrica('limão', 'verde', 20.0, 'ácido', 15, 9.0);
  Legume pimentao1 = Legume('pimentão', 'vermelho', 47.0, 25, true);
  Noz noz1 = Noz('amendoim', 'marrom', 5.2, 'seco', 10, 70.0);
  laranja1.estaMadura(30);
  laranja1.printAlimento();
  laranja1.fazerSuco();
  limao1.estaMadura(10);
  limao1.printAlimento();
  limao1.existeRefri(true);
  pimentao1.printAlimento();
  pimentao1.cozinhar();
  noz1.estaMadura(20);
  noz1.printAlimento();
  noz1.separarIngredientes();
  noz1.fazerMassa();
  noz1.assar();
}

class Alimento {
  String nome, cor;
  double peso;

  Alimento(this.nome, this.cor, this.peso);

  void printAlimento() {
    print('Este(a) $nome pesa $peso gramas e é $cor.');
  }
}

class Fruta extends Alimento implements Bolo {
  String sabor;
  int diasDesdeColheita;
  bool? isMadura;

  Fruta(
      String nome, String cor, double peso, this.sabor, this.diasDesdeColheita,
      {this.isMadura})
      : super(nome, cor, peso);

  bool? estaMadura(int diasParaMadura) {
    isMadura ??= diasDesdeColheita >= diasParaMadura;
    return isMadura;
  }

  void fazerSuco() {
    print('Você fez um ótimo suco de $nome.');
  }

  @override
  void printAlimento() {
    if (isMadura == false) {
      print('O(a) $nome de cor $cor com sabor $sabor pesa $peso gramas.\n'
          'Ele(a) foi colhido(a) há $diasDesdeColheita dias e não está maduro(a).');
    } else {
      print('O(a) $nome de cor $cor com sabor $sabor pesa $peso gramas.\n'
          'Ele(a) foi colhido(a) há $diasDesdeColheita dias e está maduro(a).');
    }
  }

  @override
  void separarIngredientes() {
    print('Separar o(a) $nome.');
  }

  @override
  void fazerMassa() {
    print('Misturar o(a) $nome com farinha, açúcar, ovos e fermento.');
  }

  @override
  void assar() {
    print('Colocar a massa no forno e esperar o bolo ficar pronto.');
  }
}

class Legume extends Alimento {
  int diasDesdeColheita;
  bool? isPrecisaCozinhar;

  Legume(String nome, String cor, double peso, this.diasDesdeColheita,
      this.isPrecisaCozinhar)
      : super(nome, cor, peso);

  void cozinhar() {
    if (isPrecisaCozinhar == true) {
      print('Pronto, o(a) $nome está cozinhando.');
      isPrecisaCozinhar = false;
    } else {
      print('Nem precisa cozinhar.');
    }
  }
}

class Citrica extends Fruta {
  double nivelAzedo;

  Citrica(String nome, String cor, double peso, String sabor,
      int diasDesdeColheita, this.nivelAzedo)
      : super(nome, cor, peso, sabor, diasDesdeColheita);

  void existeRefri(bool existe) {
    if (existe) {
      print('Existe refrigerante de $nome.');
    } else {
      print('Não existe refri de $nome.');
    }
  }

  @override
  void printAlimento() {
    print('O(a) $nome de cor $cor com sabor $sabor pesa $peso gramas\n'
        'e tem $nivelAzedo nível de azedo.');
  }
}

class Noz extends Fruta {
  double porcentagemOleoNatural;

  Noz(String nome, String cor, double peso, String sabor, int diasDesdeColheita,
      this.porcentagemOleoNatural)
      : super(nome, cor, peso, sabor, diasDesdeColheita);

  @override
  void printAlimento() {
    print('O(a) $nome de cor $cor com sabor $sabor pesa $peso gramas\n'
        'e tem $porcentagemOleoNatural% de óleo natural.');
  }

  @override
  void separarIngredientes() {
    super.separarIngredientes();
    print('Tirar a casca do(a) $nome.');
  }
}

abstract class Bolo {
  void separarIngredientes() {}

  void fazerMassa() {}

  void assar() {}
}

Saída do código:

Saída do código

2 respostas
solução!

Oi Fernando, tudo bem?

É muito interessante ver você aplicando esses conceitos em um projeto de alimentos.

No código, você definiu uma classe Alimento como classe base, e a classe Fruta herda dessa classe. Além disso, você implementou a interface Bolo na classe Fruta. Essa é uma ótima maneira de mostrar como o polimorfismo funciona, permitindo que diferentes objetos sejam tratados de maneira polimórfica.

Também é interessante ver como você sobrescreveu o método printAlimento() na classe Fruta, Citrica e Noz, personalizando a saída de acordo com as características específicas de cada tipo de alimento. Isso é um exemplo claro de como a sobrescrita permite que você altere o comportamento de um método em uma classe filha.

A saída do código que você mostrou está correta, exibindo as informações corretas para cada tipo de alimento. É realmente impressionante ver como você está aplicando esses conceitos de maneira prática.

Continue assim, explorando e praticando esses conceitos de orientação a objetos em Dart. Tenho certeza de que isso irá ajudá-lo a desenvolver projetos ainda mais interessantes no futuro.

Um abraço e bons estudos.

Obrigado Lorena, um abraço!