Olá outra vez!
Espero que tenha cumprido o que o exercício propôs, quis ir mais além porém, por isso tentei colocar todos os atributos nomeados, acho que fica mais legível na construção do objeto, apanhei bastante, mas graças ao vscode consegui(por favor olha comentário do código), também achei algumas informações sobre o mixin, então tive a ideia de criar uma classe mixin ParaVeiculosTerrestres, no qual conteria o método frear, porém não consegui fazer com que este método alterasse a variável da classe Veiculo, então desisti por enquanto e criei uma outra classe VeiculoTerrestre, espero que mais a frente também aprenderemos sobre mixin e porque é necessária. Ainda não consigo ver a necessidade de ter o construtor que praticamente nos faz repetir os atributos, piora quando é sobre os atributos do pai, só gostaria de entender o por que disso.\n Obs: Falhas, melhorias e ou Dicas não existe em me informar, não coube todo o código então repartir em dois sendo a segunda parte nos comentários. link do exercício completo
//importação do VS code não sei ainda
//import 'package:veiculos/veiculos.dart' as veiculos;
//importação para ter o pause em segundos
import 'dart:io';
void main(List<String> arguments) {
Carro gol =
Carro(modelo: "gol", marca: "VW", cor: "Azul", velocidadeMaxima: 180);
gol.ligar();
gol.desligar();
gol.acelerar(forca: 1);
gol.ligar();
gol.acelerar(forca: 1);
gol.acelerar(forca: 1);
gol.getVelocidadeAtual();
gol.frear();
gol.desligar();
Barco lancha = Barco(
modelo: "Lanchax1",
marca: "Tupiniquin",
cor: "preta",
velocidadeMaxima: 120,
velocidadeAtual: 0,
estaLigado: true);
lancha.acelerar(forca: 1);
lancha.levantarAncora();
while (lancha.velocidadeAtual < lancha.velocidadeMaxima) {
lancha.acelerar(forca: 1);
lancha.getVelocidadeAtual();
}
lancha.desligar();
}
class Veiculo {
String modelo;
String marca;
String cor;
double velocidadeMaxima;
double velocidadeAtual;
bool estaLigado;
Veiculo(
{required this.modelo,
required this.marca,
required this.cor,
this.velocidadeAtual = 0,
required this.velocidadeMaxima,
this.estaLigado = false});
void ligar() {
if (!estaLigado) {
print("Ligando o veiculo!");
sleep(const Duration(seconds: 2));
estaLigado = true;
print("O motor do veiculo esta ligado!");
}
}
void desligar() {
if (estaLigado) {
print("Desligando o veiculo!");
sleep(const Duration(seconds: 1));
estaLigado = false;
print("O motor do veiculo esta desligado!");
}
}
void acelerar({double forca = 0.1}) {
if (estaLigado) {
print("Veiculo acelerando...");
sleep(const Duration(seconds: 1));
velocidadeAtual += forca * 10;
} else {
print("O veiculo não pode ser acelerado, pois está desligado!");
}
//Garantindo que o veiculo não passe da Velociade maxima
if (velocidadeAtual > velocidadeMaxima) {
velocidadeAtual = velocidadeMaxima;
}
//Na frenagem garantir a velociadade não seja negativa
if (velocidadeAtual < 0) velocidadeAtual = 0;
}
void getVelocidadeAtual() {
print("O veiculo está a $velocidadeAtual" "Km/h");
}
}
class VeiculosTerrestres extends Veiculo {
VeiculosTerrestres({
required String modelo,
required String marca,
required String cor,
required double velocidadeMaxima,
double velocidadeAtual = 0,
bool estaLigado = false,
}) : super(
modelo: modelo,
marca: marca,
cor: cor,
velocidadeMaxima: velocidadeMaxima,
velocidadeAtual: velocidadeAtual,
estaLigado: estaLigado);
//O por que desses dois pontos e qual o nome disso
//gostaria de saber, se não for ter nas proximas aulas
void frear() {
print("Freando o veiculo!");
sleep(const Duration(seconds: 2));
super.velocidadeAtual = 0;
print("Veiculo parado!");
}
}
class Carro extends VeiculosTerrestres {
//estes atributos teram um valor padrão
int qtdPortas;
int qtdBancos;
bool temPortaMalas;
Carro(
{required String modelo,
required String marca,
required String cor,
required double velocidadeMaxima,
double velocidadeAtual = 0,
bool estaLigado = false,
this.qtdBancos = 1,
this.qtdPortas = 0,
this.temPortaMalas = true})
: super(
modelo: modelo,
marca: marca,
cor: cor,
velocidadeMaxima: velocidadeMaxima,
velocidadeAtual: velocidadeAtual,
estaLigado: estaLigado);
abrirPortasMalas() {
if (temPortaMalas) print("Porta-malas aberto!");
}
} // Continua