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

D

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…

S

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();
C

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

R

e que deve ser raro …

L

Porque?

R

É 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.

S

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.

L

Entendi, obrigado pelas explicações :slight_smile:

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