Ir para conteúdo
Fórum Script Brasil
  • 0

Código.. como resolvo?


Miltonlp

Pergunta

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 {
      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

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Tenta usar "if"

Por exemplo:

if (codigo do cliente == 1){
//chame o método para cliente 1
}

if(codigo do cliente == 2){
//Chame o método para cliente especial

}

if(codigo do cliente >=2){
System.out.print("erro, entre apenas 1 ou 2");
// chame novamente o método main para ler novamente ou reinicie o programa
}

Link para o comentário
Compartilhar em outros sites

  • 0

Caro DarthVictor,

Obrigado pela resposta

tentei utilizar dessa forma, mas meu professor falou que não estaria trabalhando de forma orientada a objetos :S

não entendi muito bem o que ele quis dizer, já que estaria perguntando ao usuário e conforme sua resposte chamaria vez um método, vez outra...

bom... se alguém souber de outra maneira eu agradeço =]

Link para o comentário
Compartilhar em outros sites

  • 0

o mais certo acho q seria você ler o teclado (se é 1 ou 2) e passar como parametro para a classe no constructor ou qualquer coisa assim.

ai você teria apenas um metodo Bonificacao(). o valor da bonificacao (0.1 ou 0.2) você gravaria numa propriedade privada dentro da classe. e ai o metodo Bonificacao() calcularia baseado nessa variavel.

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia,

é o seguinte, consegui chamar o método vez com um cliente, vez com outro mas preciso de um outro detalhe:

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á

Link para o comentário
Compartilhar em outros sites

  • 0

so agora entendi q você tava herdando o cliente especial do cliente, mas acho q o melhor é ter uma classe so e, pra diferenciar, você faria como eu disse no post de cima.

bom, talvez a ideia do exercicio, do seu professor seja diferente do q to imaginando, mas ainda acho q isso é a melhor forma.

se a unica diferenca entre o cliente e o cliente especial é um unico valor, acho uma coisa completamente sem sentido criar uma nova classe somente pra isso. alias, mesmo se fossem mais diferencas. se o cliente especial é tb um cliente, tinha q ser uma coisa so. heranca não serve pra usar dois objetos diferentes como se fosse o mesmo.

o melhor seria usar uma classe so e ai você pudia por uma propriedade pra identificar se é cliente especial ou não.

Editado por kuroi
Link para o comentário
Compartilhar em outros sites

  • 0

Kuroi

Realmente faz todo o sentido o que você disse.

Mas o detalhe é que realmente pede essas classes explicitamente no exercício.

Pede pra criar uma classe Cliente e em uma outra etapa pede para criar outra classe que tenha os mesmos atributos, mas com esse método sobrescrito.

Fiz essa pergunta para um amigo que trabalha com programação e ele me disse que esse de coisa que estou tentando fazer é normal (talvez não para uma aplicação como a que estou fazendo, mas para outros tipos de problema).

Estava tentando terminar o exercício e resolvi ver o que acontece com minhas variáveis usando debug.

No meu caso, ele chama realmente o método da classe Filha (quando instancio um objeto de tal classe) mesmo quando faço a instrução:

((Cliente) cliente).Bonificacao();

O programa passa por essa instrução e ao invés de fazer como dito no código ele chama direto o método da classe filha mesmo.

Não entendi ainda porque continua desse jeito, já que ele passa por essa linha do código. Só não faz corretamente o casting.

Obrigado,

Att

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...