Elaborei um exercício com veículos de transporte, para tentar abstrair o conceito de polimorfismo e sobrescrita com outro tema que não fosse alimentos. Dessa forma, abaixo eu crio 5 objetos de transporte, e faço alguns testes para cada um deles.
"Transporte" é a classe concreta principal, e dela derivam 2 sub-classes, "Motorizado" e "NaoMotorizado". Para a classe "Motorizado"temos as classes filhas "Eletrico" e "Combustao" e também temos uma implementação de uma classe abstrata "Motor" das quais as duas classes filhas se utilizam. Para motores à combustão ainda é possível definir o tipo do combustível.
Já para a sub-classe "NaoMotorizado" apenas implementei um método para verificar se o veículo está montado ou não.
Tive diversos problemas na hierarquia entre as classes, e isso me fez entender bem o conceito sobre em qual classe devo utilizar quais métodos, sendo que classes mais baixas herdam as variáveis das classes mais altas, sendo que o contrário não é verdadeiro, então tentar usar uma variável mais específica dentro de uma classe mais alta não funcionaria e isso tem uma relação importante com a estrutura e a lógica do que você está implementando.
Bons estudos a todos! :)
void main() { NaoMotorizado patinete01 = NaoMotorizado('Happy', 10, 'azul', true); NaoMotorizado bicicleta01 = NaoMotorizado('Caloi', 20, 'verde', false); NaoMotorizado bicicleta02 = NaoMotorizado('Monark', 20, 'verde', true); Eletrico carro01 = Eletrico('HB20', 600, 'prata'); Combustao caminhao01 = Combustao('Volvo', 3500, 'amarela', 'Diesel');
//testando alguns métodos
//PATINETE patinete01.printVeiculo(); //BICICLETA bicicleta01.printVeiculo(); bicicleta01.estaMontado(); bicicleta02.estaMontado(); //CARRO carro01.printVeiculo(); carro01.montarMotor(); carro01.adicionarCombustivel(); //CAMINHAO caminhao01.printVeiculo(); caminhao01.adicionarCombustivel(); }
class Transporte { String nome; double peso; //kg String cor;
//construtor Transporte(this.nome, this.peso, this.cor); }
class Motorizado extends Transporte implements Motor { Motorizado(String nome, double peso, String cor) : super(nome, peso, cor);
@override void montarMotor() { print('Montar o motor com as peças selecionadas!'); }
@override void encaixarMotorNoChassi() { print('Encaixar o motor montado no chassi do $nome!'); }
@override void adicionarCombustivel() { print('Adicionar combustível ao motor montado.'); } }
class NaoMotorizado extends Transporte { bool isMontado;
NaoMotorizado(String nome, double peso, String cor, this.isMontado) : super(nome, peso, cor);
//metodos void printVeiculo() { print( "Este(a) $nome pesa $peso quilogramas e é $cor. Esse veículo não possui motor"); }
void estaMontado() { if (isMontado == true) { print("Esse(a) $nome está montada!"); } else { print("Você precisa montar esse(a) $nome."); } } }
class Eletrico extends Motorizado { String? tipoMotor = 'Elétrico';
//construtor Eletrico(String nome, double peso, String cor, {this.tipoMotor}) : super(nome, peso, cor);
//metodos
void printVeiculo() { print( "Este(a) $nome pesa $peso quilogramas e é $cor. Esse veículo possui motor"); }
@override void montarMotor() { print('Esse $nome é elétrico. Selecionar as peças para motor elétrico'); super.montarMotor(); }
@override void encaixarMotorNoChassi() { print('Encaixar o motor no chassi.'); }
@override void adicionarCombustivel() { print( 'Esse $nome não utiliza combustíveis fósseis. Utiliza energia elétrica.'); } }
class Combustao extends Motorizado { String combustivel;
Combustao(String nome, double peso, String cor, this.combustivel) : super(nome, peso, cor);
void printVeiculo() { print( "Este(a) $nome pesa $peso quilogramas e é $cor. Esse veículo possui motor e é movido à $combustivel"); }
@override void montarMotor() { print('Selecionar as peças para motor a combustão'); }
@override void encaixarMotorNoChassi() { print('Encaixar o motor no chassi.'); }
@override void adicionarCombustivel() { print('Esse $nome tem motor à combustão. Adicionar $combustivel ao motor.'); } }
abstract class Motor { void montarMotor() { print("Montar o motor com as peças selecionadas"); }
void encaixarMotorNoChassi();
void adicionarCombustivel(); }