estou fazendo um programa de locadora de veiculos e preciso usar um menu.
pra isso criei a locação fora do Swich case, e dentro dele a setei como carro ou moto.
mas por alguma razão não consigo usar os metodos de carro ou moto para setar os valores
apenas os metedos de locação.
como posso usalos para setar tais valores que são especificos de carro e moto??..
exmeplo
carro possui um modelo
moto possui numero do capaçete
os metodos estão em suas respectivas classes
mas não consigo usalos
Setando classe filha atravez de classe pai
12 Respostas
Não é uma boa prática fazer a classe pai conhecer suas filhas, isso aumenta o acoplamento e futuramente pode dificultar na manutenção, hoje são duas classes (carro e moto), amanhã chega um triciclo, avião, barco, etc… vai imaginando onde isso pode chegar…
Enfim, não há outros meios para resolvermos esse problema? Como estão suas classes? Já pensou usar interfaces para sanar isso?
preciso disso para um trabalho e essa a sugestão dada pelo meu professor para eu pudesse trabalhar com a variavel entre os cases
cria-la fora dos cases e especifica-la dentro deles como o fiz
antes de entrar criei uma Locação l;
e dentro do case a depender do tipo l = newCarro(); ou l = newMoto();
mas acredito q por ter-la iniciado antes como Locação não tenho como usar os metodos de carro e moto mesmo tendo-a instanciado como objeto carro ou moto.
obs: ainda não estamos usando interfaçes
Hmm, entendi, mas só pra constar, seu professor pediu que você extendesse carro e moto para locação ou foi pedido que usasse herança e você quem está modelando dessa forma?
Se ele fez isso, me desculpe mas o conceito ele já está te passando errado na minha opinião… Como estão suas classes? Queremos ver código, queremos ver código!!!
bom… ja que a locação vai ter os tipos de carro e de moto, carro e moto estão extendendo locação…
public class Carro extends Locação{
protected float cvalor = 95;
protected String modelo;
//gets e sets
public String getModelo() {
return modelo;
}
public void setModelo(String modelo) {
this.modelo = modelo;
}
}
public class Moto extends Locação{
protected float mvalor = 35;
protected int capacete;
public int getCapacete() {
return capacete;
}
public void setCapacete(int capacete) {
this.capacete = capacete;
}
}
e o codigo de locação
public class Locação {
protected String placa;
protected String numeroveiculo;
protected Cliente locador;
protected Data datae;
protected Data Datas;
// Gets e Sets
public Data getDatae() {
return datae;
}
public void setDatae(Data datae) {
this.datae = datae;
}
public Data getDatas() {
return Datas;
}
public void setDatas(Data Datas) {
this.Datas = Datas;
}
public String getPlaca() {
return placa;
}
public void setPlaca(String placa) {
this.placa = placa;
}
public String getNumeroveiculo() {
return numeroveiculo;
}
public void setNumeroveiculo(String numeroveiculo) {
this.numeroveiculo = numeroveiculo;
}
public Cliente getLocador() {
return locador;
}
public void setLocador(Cliente locador) {
this.locador = locador;
}
Faça o cast que você conseguirá usar os métodos que quer:
Locacao l1 = new Carro();
Locacao l2 = new Moto();
Moto moto = (Moto) l2;
moto.metodoDeMoto();
Opinião
Recomendo que não faça herança entre locacao e carro/moto, pois, carro não é uma locação, mas sim um bem que será locado numa locação, ou seja, locação POSSUI UM bem locado (carro/moto).
pode explicar essas 2 linhas de codigo??
Moto moto = (Moto) l2;
moto.metodoDeMoto();
ps: ainda n vimos casting
Seu código ficaria melhor assim:
class Veiculo {}
class Moto extends Veiculo {
// ...
}
class Carro extends Veiculo {
// ...
}
Depois em locação...
class Locacao {
// ...
public void setVeiculo(Veiculo veiculo) {
if (veiculo instanceof Moto) {
veiculo.getCapacete();
}
if (veiculo instanceof Carro) {
veiculo.getModelo();
}
}
}
OBS: Também não seria uma boa implementação, mas o conceito fica mais coerente (alta coesão entre veiculo, carro e moto…)…
nesse caso a classe veiculo seria simplesmente um classe vazia??? para que a transição pudesse ser feita??? ou haveria algum codigo nela?
Bom, isso é você que deve decidir, quais atributos que carro e moto tem em comum que podem ficar na classe veiculo, marca? modelo? rodas? motor?, enfim, cada projeto tem sua regra, de início mostrei apenas como classe de transição (o que também não seria uma boa, mas como seu professor quer exemplos usando herança…)
Sempre que você precisar/achar que deve extender uma classe, lembre-se do conceito é um e tem um, um artigo sobre o assunto aqui
é… n da pra entender como encaixar isso no codigo tendo apenas noção de parte dele e como n vejo como enviar tudo aqui… giving up… mas obrigado pela ajuda
Cara, herança no começo é meio chato de entender… Sugiro caso ainda não entedeu isso, pedir uma explicação pro teu professor, procure tutoriais, livros etc. sobre isso. Sugiro tentar entender bem para começar a fazer.