Ir ao conteúdo

Código... como resolvo?


miltonlp

Posts recomendados

Postado

Boa Tarde galera,

sou novo aqui e estou tentando aprender Java

Eu preciso fazer um programa mas estou com um problema

aí vai o código


class Cliente {
private double desconto;

public double getDesconto() {
return this.desconto;
}

public void setDesconto(double desconto) {
this.desconto = desconto;
}

public double Bonificacao(double desconto) {
return desconto + (desconto * 0.1);
}
}

//O Cliente Especial tem uma bonificacao a mais
class ClienteEspecial extends Cliente {
public double Bonificacao() {
return desconto + (desconto * 0.2);
}
}

//Classe com main para testar o que foi feito
class TestaCliente {
public static void main(String args[]) {
Scanner scan = Scanner(System.in);
System.out.println("1 - Cliente");
System.out.println("2 - Cliente Especial");
int op = scan.NextInt();
//Teoricamente, depois dessa linha eu poderia escolher com qual Cliente eu trabalharia, mas como faço isso sem
//escrever duas vezes o mesmo código?
}
}

Claro que é apenas um exemplo, o código que fiz está com bem mais coisas e seria cansativo instanciar as 2 classes e perguntas 2 vezes para o usuário (1 vez para Cliente e outra para ClienteEspecial) todos os atributos que precise.

Também estaria trabalhando de uma forma estruturada, o que não é a intenção.

Se vocês puderem me ajudar...

Desde já agradeço

Postado

Pra isso você pode usar a herança:

class ClienteEspecial extends Cliente { 
...
}

Ou seja, um ClienteEspecial É um Cliente, logo herda todos os atributos dele.

Assim, quando for instanciar, você pode ter uma variável única para ambos:

Cliente clienteA = null;

E ao criar um objeto:

clienteA = new Cliente();
// ou clienteA = new ClienteEspecial();

Quanto ao seu menu, sugiro um switch:


char opcao = ...;
Cliente cliente = null;
switch (opcao) {
case '1': cliente = new Cliente(); break;
case '2': cliente = new ClienteEspecial(); break;
default: ...; // opção inválida
}

;)

Postado

cara, pra isso voce pode usar ou o switch, ou os ifs...se nao forem muitas opções e mais pratico trabalhar com o if, caso contrario use o switch...!!!

Postado

Trebloc

Obrigado pela resposta, e desculpe minha falta de atenção com relação a isso

mas eu realmente estou herdando da classe Cliente

esqueci de colocar no código acima

abaixo, eu utilizaria um swtich mesmo, mas eu pergunto pro usuário e se for 1 eu faço o que?

Instancio a classe nesse ponto e chamo o método sobrescrito?

Na verdade é esse o meu problema.

Eu precisava ter uma opção de chamar vez o método da classe Cliente, vez o método da Classe filha ClienteEspecial.

Mas eu queria arranjar um jeito de não precisar instanciar 1 vez cada classe, fazer algo diferente, porque se eu colocar assim


Cliente cliente = new Cliente();
ClienteEspecial clienteEspecial = new ClienteEspecial();

//aqui instancio as duas classes. Na hora que precisar chamar o método reescrito, chamaria dessa forma:


//chama o método sobrescrito
clienteEspecial.Bonificacao();

O que quero dizer é o seguinte, caso eu entre depois com um Cliente normal, que não seja especial, essa linha de código ficaria duplicada e queria ver se tinha alguma forma de não ser assim:


switch(op) {
//Se for 1, Cliente normal
//Chama o método da classe pai
case 1: cliente.Bonificacao();
break;
//Se for 2, Cliente Especial
//chama o método da classe filha
case 2: [B]clienteEspecial.Bonifcacao();[/B]
}

É nessa linha que tenho o problema. Crio a instancia clienteEspecial SOMENTE para chamar o método Bonificacao sobrescrito.

Sendo que já que ClienteEspecial É um Cliente, poderia chamar todos os outros atributos apenas com o objeto cliente.

Consegui explicar?

Obrigado

Postado

Novamente, basta fazer do jeito que postei, uma variável para os dois tipos de objetos:

Cliente cliente = null;
// cliente = new Cliente();
// cliente = new ClienteEspecial();

Você precisa lembrar que as chamadas de métodos são feitas de acordo com a classe do objeto cuja referência é mantida na variável, e não pelo tipo de variável:

cliente.bonificacao();

Se for um Cliente, usa o método da classe Cliente. Se for um ClienteEspecial, usa o método da classe ClienteEspecial.

Postado

hmm..

Certo! Entedi

desculpe a falta de atenção é que na verdade o código estava parecido com o que tinha pensado e o meu professor falou que não poderia ser do jeito que coloquei, mas dessa forma é bem diferente. Vou levar e mostrar pra ele na próxima aula

Obrigado

Postado

Boa Tarde,

tenho mais um problema agora...

Preciso implementar uma forma de chamar os dois métodos.

Por exemplo, eu declaro que o Cliente é um ClienteEspecial


char opcao = ...;
Cliente cliente = null;
switch (opcao) {
case '1': cliente = new Cliente(); break;
case '2': cliente = new ClienteEspecial(); break;
default: ...; // opção inválida
}

digamos então, que op = 2 ok?

Mas depois, preciso fazer uma pergunta: "O Cliente tem alguma pendência?"

Se sim, ele não tem mais essa Bonificação, ou seja, ele não chama mais o método da Classe ClienteEspecial e sim o da classe Pai

procurei na net sobre e disseram que para chamar um método da classe Pai que foi reescrito, tem que fazer dessa forma:


((Cliente) cliente).Bonificacao();

Coloquei esse código mas não rodou da forma correta. Ele continua chamando o método da classe ClienteEspecial

Agradeço desde já

  • 2 semanas depois...
Postado

Boa tarde Galera, eu to com um problema:

Sou iniciante em programaçao e tenho uma questao a resolver:

Eu tenho que calcular as raizes de uma equaçao do 2º Grau e mostrar no formato x+yi.

:(

eu tenho que entregar na Segunda Feira, espero que me ajudem.

Abraçows!!

O código:

package exemplo;

import java.io.*;

import java.util.*;

public class Baskara {

public static void main(String args[]) throws IOException{

double a,b,c;

double delta,x1,x2;

Scanner valores=new Scanner(System.in);

System.out.print("Digite os coeficientes da equaçao :");

a=valores.nextDouble();

b=valores.nextDouble();

c=valores.nextDouble();

delta =((b*B)-(4*a*c));

System.out.println("O valor de Delta é:" +delta);

if(delta>0){

System.out.print("Delta maior que zero, as raizes são reais e diferentes");

}

else if(delta==0){

System.out.println("Delta igual a zero, as raizes sao reais e iguais");

}

else if(delta<0){

System.out.println("Delta menor que zero, as raizes sao complexas");

}

System.out.println();

x1 =((-b+(Math.sqrt(delta)))/( 2*a ) );//Aqui é calculado o X'//

x2= ((-b-(Math.sqrt(delta)))/(2*a));

if(delta>0){

System.out.println("X' é igual a:" +x1);

System.out.println("X'' é igual a:" +x2);

}

else{

System.out.println("Delta invalido");

}

}

}

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!