Classe Abstrata

5 respostas
Igor_Novaes

Olá Todos!

Gostaria de contar com a ajuda de vocês numa dúvida sobre instanciação no código abaixo.

Ao criar o objeto cliSub tem-se a visibilidade dos métodos abstratos e do método Emprestimo().
Mas ao criar o objeto cli não tem-se a visibilidade do método Emprestimo(), uma vez que estou
criando um Cliente e não um ClienteSub.

Pergunta:
Há como ter a visibilidade do Emprestimo() fazendo a instanciação desta forma?
Ou de uma maneira que eu centralize a criação de objetos concretos herdados de Cliente?

Cliente cli = new ClienteSub();

Porque isso?:
Porque estou utilizando o Patern AbstractFactory, juntamente com o FactoryMethod numa aplicação como esta e não consigo
trabalhar com os métodos da classe concreta.

Obrigado a todos!

public abstract class Cliente {
    abstract void Compra();
    abstract void Orcamento();
}

public class ClienteSub extends Cliente{

    void Compra() {
        System.out.println("Comprando");
    }

    void Orcamento() {
        System.out.println("Orçando");
    }

    public void Emprestimo(){
        System.out.println("Tomando Empréstimo");
    }
}

public class main {
    public static void main(String []args){
        ClienteSub cliSub = new ClienteSub();
        cliSub.Orcamento();

        Cliente cli = new ClienteSub();
        cli.Emprestimo();   <---------Objetivo
    }
}

5 Respostas

F

Dessa maneira que você fez, você somente tem acesso aos métodos que a superclasse disponibiliza, veja bem, o seu código diz o seguinte:" Eu Sou ClienteSub com cara de Cliente" , entende, pra que o método emprestimo seja acessivel você dever instânciar a classe concreta o que quebra o seu padrão ou fazer dele um método abstrato também, porque dessa maneira você vai conseguir utiliza-lo, isso porque como eu disse anteriormente você só tem a visibilidade dos métodos da classe Abstrata.

Não sei se consegui ser claro mas é isso qualquer outra duvidaposta ai.

Abraços

peresjuliao

Olá amigo

Estou estudando sobre isso e pelo que eu entendi você está utilizando “Herança” e “Classe Abstrata”, apartir do momento em que você define a superclasse como abstrata, não tenho certeza, mas não pode instacia-la. Para isso você tem que usar polimorfismo.

Abraços

Brn_SI

kra deste modo que vc fez ai, a sua classe Cliente nao tem como instaciar ela mesma ela precisa de um outra classe filha para instancia-la obrigando a classe filha ter os seus metodos de acesso. toda classe abstrata nao tem como instancia-la a si mesma tem que ter uma classe filha obrigando esta classe filha a ter os metodos da mae para instacia-la.

flw

Renyo

Você pode se quiser, pegar o seu método empréstimo e jogar pra dentro da classe abstrata.

mas isso fica ao seu critério,

seria melhor mesmo deixar o cabeçalho lá… ficando assim

public abstract class Cliente { abstract void Compra(); abstract void Orcamento(); abstract void Emprestimo(); }

ou assim

public abstract class Cliente { abstract void Compra(); abstract void Orcamento(); void Emprestimo() { System.out.println("Oi"); }; }

adriano_si

Outra observação… vc criou uma classe abstrata com todos os métodos abstratos… se em uma classe abstrata vc não possuir pelo menos um método não abstrato é viável que vc a torne uma interface…

Lembre, isso não é uma regra, e sim uma boa prática…

na linha que vc quer acessar, só vai conseguir (da forma que seu código está agora) se criar uma referncia de ClienteSub… vamos esquadrinhar um pouco como o Java lê essa sua implementação…

1 - Criou um Cliente cli, esse cli é um Cliente não um ClienteSub

2 - Atribuiu um Objeto ClienteSub a esse Cliente, pode afinal ClienteSub é herdeiro de Cliente;

3 - A característica Emprestimo() é somente do herdeiro e não do pai, logo o cli não tem a característica emprestimo();

Pensa comigo… temos uma classe Pai e uma classe Filho
Filho herda tudo que o Pai tem + olhosAzuis… Filho tem o método exibirOlhosAzuis()

Aí vc cria Pai p = new Filho(); -> isso POOODE estamos fazendo polimorfismo

porém p é um Pai e não tem olhos azuis, logo p não pode acessar esse método de filho…

Cara só pra concluir… ou vc cria um ClienteSub pra acessar emprestimo(), ou coloca emprestimo() como fazendo parte de sua classe abstrata, pode até ser implementada como está, aí terá uma razão pra ser abstrata… Pense na sua solução, mesmo que para isso tenha que sair do padrão adotado, ou alterar para um padrão que se adeque a sua solução… “a solução do Problema está sempre acima de qualquer padrão” Autor: Algum programdor POG…

Falows :wink:

Criado 28 de dezembro de 2008
Ultima resposta 29 de dez. de 2008
Respostas 5
Participantes 6