Neste “post” utilizo o mesmo exemplo da primeira fase, porém com um código mais limpo, complexo e reaproveitável.
public class Veiculo {
// veja que a nossa Veiculo sofreu algumas modificações:
// foram incluidos os metodos: volante, nome, material e desloca; (antes eles estavam sendo instanciados dentro de cada tipo de veiculo sem necessidade uma vez que os mesmos metodos são comuns entre eles)
// retirado os metodos: *motor e **roda; (*o motor terá uma classe separada para receber maiores detalhes e a **roda é um item que só existia no carro)
private String volante;
private String combustivel;
private String nome;
private String material;
private String desloca;
public String getVolante() {
return volante;
}
public void setVolante(String volante) {
this.volante = volante;
}
public String getCombustivel() {
return combustivel;
}
public void setCombustivel(String combustivel) {
this.combustivel = combustivel;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getMaterial() {
return material;
}
public void setMaterial(String material) {
this.material = material;
}
public String getDesloca() {
return desloca;
}
public void setDesloca(String desloca) {
this.desloca = desloca;
}
}
public interface Acao {
void ligar();
}
public class Motor {
// aqui eu tenho uma classe *motor que por sua vez tem cilindradas e cavalos, essa especificação será utilizada futuramente e pode ser usado por qualquer tipo de veiculo ou não.
int Cilindradas;
long Cavalos;
public int getCilindradas() {
return Cilindradas;
}
public void setCilindradas(int cilindradas) {
Cilindradas = cilindradas;
}
public long getCavalos() {
return Cavalos;
}
public void setCavalos(long cavalos) {
Cavalos = cavalos;
}
}
public class VeiculoAquatico extends Veiculo {
// aqui foi criado um subtipo de Veiculo, trata-se de veiculo aquatico, essa classe esta bem simples e tem apenas o que o Veiculo tem (volante, combustivel, nome, material e desloca), mas poderia ter outras coisas como hélice, remos, velas, etc
}
public class VeiculoTerrestre extends Veiculo {
// aqui eu tenho outro subtipo de Veiculo, trata-se de veiculo terrestre, essa classe esta bem simples e além dos métodos do Veiculo tem também a **roda que foi transferido para os veiculos terrestres exclusivamente.
private String roda;
public String getRoda() {
return roda;
}
public void setRoda(String roda) {
this.roda = roda;
}
}
public class Barco extends VeiculoAquatico implements Acao {
// aqui eu tenho uma grande mudança, o Barco agora extends do VeiculoAquatico mas continua implements com a Acao
Motor m = new Motor();
// neste ponto eu digo que o tipo de veiculo aquatico barco tem um motor, este new motor() mostra que posso utilizar os métodos do motor através do apelido "m".
// outra grande mudança é o uso do toString na classe Barco, com ela eu informo qual tipo de informação a classe Barco vai imprimir quando for solicitado um print da mesma, isso será usado em todas as classes que imprimirem o Barco.
public String toString(){
return ("\n Nome: " + getNome()
+ "\n Motor: " + m.getCavalos() + " - Cavalos " + m.getCilindradas() + " - Cilindradas " // ja estou usando itens do motor()
+ "\n Combustivel: " + getCombustivel()
+ "\n Desloca: " + getDesloca()
+ "\n Comando: " + getVolante()
+ "\n Ligando..." );
}
// a Acao de ligar() não foi alterado
@Override
public void ligar() {
System.out.println("Tectectectectec...");
}
}
public class Carro extends VeiculoTerrestre implements Acao {
// Agora Carro passou a ser um VeiculoTerrestre que implements a Acao
// Possui motor()
Motor m = new Motor();
// Para mudar um pouco o exemplo foi colocado um particularidade para o Carro, ele terá também cor e modelo
String cor;
String modelo;
public String getCor() { // get and set da cor
return cor;
}
public void setCor(String cor) {
this.cor = cor;
}
public String getModelo() { // get and set do modelo
return modelo;
}
public void setModelo(String modelo) {
this.modelo = modelo;
}
// Aqui também utilizo o toString para impressão
public String toString(){
return ("\n Nome: " + getNome()
+ "\n Motor: " + m.getCavalos() + " - Cavalos " + m.getCilindradas() + " - Cilindradas "
+ "\n Roda: " + getRoda()
+ "\n Combustivel: " + getCombustivel()
+ "\n Desloca: " + getDesloca()
+ "\n Comando: " + getVolante()
+ "\n Cor: " + getCor() //cor
+ "\n Modelo: " + getModelo() //modelo
+ "\n Ligando..." );
}
//aqui esta o metodo da acao
@Override
public void ligar() {
System.out.println("Vrummmmmmmmmmm...");
}
}
public class VeiculoTeste {
public static void main(String args[]) {
// classe VeiculoTeste continua com o "main" para imprimir o resultado do meu programa.
// Imprimindo o Carro
Carro c = new Carro();
// New Carro - colocando os valores.
c.setCombustivel("Gasolina");
c.setNome("Fusca");
c.setDesloca("Asfalto");
c.setVolante("Volante Preto");
c.setRoda("Aro 15");
//Traduzindo: carro.motor.cavalos = 97 ; carro.motor.cilindradas = 1000;
c.m.setCavalos(97);
c.m.setCilindradas(1000);
// Imprime o que o toString do Carro estiver mandando com os valores que eu coloquei acima
System.out.println(c);
// Faz minha Acao
c.ligar();
// pula
System.out.println(" ");
// pula
// Idem para imprimir o Barco
Barco b = new Barco();
b.setCombustivel("Gasolina");
b.setNome("Mercure 200");
b.setDesloca("Agua");
b.setVolante("Manche Azul");
b.m.setCavalos(500);
b.m.setCilindradas(5200);
System.out.println(b);
b.ligar();
}
}
Essa é a saída do meu programa:
