Ajuda com metodos

9 respostas
java
J

Ola, tenho 3 classes (carro, moto e caminhão) e preciso um objeto e controlar a velocidade dos 3 individualmente. Fiz os seguintes métodos:

public void acelerarCarro(){

if(motor==true){

velocidade = velocidade + 10;

}else{

velocidade = 0;

}

}
public void acelerarMoto(){
    if(motor==true){
    velocidade = velocidade + 20;
    }else{
        velocidade = 0;
    }    
}

public void acelerarCaminhao(){
    if(motor==true){
    velocidade = velocidade + 5;
    }else{
        velocidade = 0;
    }

}

E gostaria de saber como posso simplificar-los. fazer um método só, que identifique o objeto e atribua a velocidade correspondente.

9 Respostas

darlan_machado

Estas três classes são subclasses de uma chamada Veiculo, certo?
Se sim, você pode criar três constantes

public static final int ACELERA_CARRO = 10;
public static final int ACELERA_MOTO = 20;
public static final int ACELERA_CAMINHAO = 5;

E, dentro do método, fazer algo como

if(this instanceof Carro) {
     velocidade += ACELERA_CARRO;
} else if(this instanceof Moto) {
     velocidade += ACELERA_MOTO;
} else if(this instanceof Caminhao) {
     velocidade += ACELERA_CAMINHAO;
}

Isso pode ser melhorado, caso você já tenha visto maps, como eu creio que não, isso aí deve resolver.

J

ok… vou testar… valeu pela ajuda…

staroski

Se suas 3 classes estendem uma classe Veiculo, é só declarar um método abstrato acelerar na classe Veiculo e implementar ele em cada subclasse.

Depois é só fazer algo assim:

Veiculo carro = new Carro();
Veiculo caminhao = new Caminhao ();
Veiculo moto = new Moto();

carro.acelerar();
caminhao.acelerar();
moto.acelerar();
Crocodilo

@darlan_machado, vejo que você usou o instanceof , coisa rara de se ver :wink:

rmendes08

e que deve ser raro …

LuanFroehlich

Porque?

rmendes08

É uma má prática. Comportamentos que são específicos de uma determinada classe devem ser encapsulados dentro da própria classe, diminuindo o acoplamento entre o cliente de um tipo abstrato e as implementações desse tipo. É muito comum ouvir o argumento de que as 2 maneiras “funcionam”. Mas o problema primordial em eng. de software é como acrescentar novo comportamento causando o mínimo de impacto no que já está pronto. Nesse sentido, se você seguir a solução do @staroski por exemplo, e quiser criar um novo veiculo, basta criar uma nova classe e passar o objeto como parâmetro para classes que dependem de Veiculo, e pronto. Do contrário, se você adota uma solução baseada em instanceof você tem que alterar cada um dos pontos que utiliza as classes concretas.

staroski

Só pra complementar, geralmente quando temos situações onde são necessários muitos instanceof costuma valer a pena repensar a estrutura de classes para utilizar o padrão de projeto Visitor.

LuanFroehlich

Entendi, obrigado pelas explicações :slight_smile:

Criado 17 de agosto de 2018
Ultima resposta 20 de ago. de 2018
Respostas 9
Participantes 6