Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Composição com herança

Oi, essa é minha primeira pergunta no forum e ela veio aleatoriamente enquanto estava pensando na seguinte possibilidade: Da mesma forma que eu transformo a classe "Conta" em abstrata para impor o uso específico de uma de suas filhas (ContaCorrente e/ou ContaPoupanca), eu poderia transformar a classe "Cliente" em abstrata e criar mais 2 classes chamadas "ClienteComum" e "ClienteEspecial", herdando então as características da superclasse (nesse caso a "Cliente").

Vou mostrar a minha classe conta:

public abstract class Conta
{    
    //fields
    private static int total = 0;
    private double saldo;
    private int agencia;
    private int numero;
    private Cliente titular;    

    //getters e setters omitidos    

    //construtores
    public Conta()
    {
        this.saldo = 0;
        this.agencia = 30;
        this.numero = 0;
        this.titular = null;
        Conta.total++;
    }

    public Conta(int numero, int agencia)
    {
        this.saldo = 0;
        this.agencia = agencia;
        this.numero = numero;
        this.titular = null;
        Conta.total++;
    }
}

A SITUAÇÃO: Até aqui tudo bem, mas o problema começa a vir na composição: Reparem que nos meus atributos eu utilizo uma referência genérica para a classe "Cliente", ao invés de usar uma classe filha como "ClienteComum" ou "ClienteEspecial" que eu poderia ter. Isso porque eu quero que minha classe "Conta" possa trabalhar com todos os tipos de Cliente no meu banco. Porém eis que a dúvida surge: Se cada filho da classe "Cliente" possuir um método específico para si, como que eu posso chamá-los a partir de um objeto instanciado da classe conta, considerando a restrição da instância genérica (classe Cliente) X instância específica (classe ClienteComum)

Por exemplo:

Nessa situação, eu posso fazer isso porque o "getNome();" está na superclasse;

public static void main(String[] args)
    {
        ContaCorrente cc = new ContaCorrente(100, 200);
        ClienteComum comum = new ClienteComum();            
        cc.setTitular(comum);
        cc.getTitular.getNome();
    }

Mas eu não conseguiria fazer isso, porque o método "euSouNormal();" é exclusivo da classe "ClienteComum":

public static void main(String[] args)
    {
        ContaCorrente cc = new ContaCorrente(100, 200);
        ClienteComum comum = new ClienteComum();            
        cc.setTitular(comum);
        cc.getTitular.euSouNormal();
    }

Como que eu resolvo/contorno esse problema? Desculpem-me pelo texto gigante, eu estou começando com java e não tenho experiência com programação. Gostaria de saber se essa é uma dúvida pertinente e se casos como esse ocorrem com frequência no dia a dia de um desenvolvedor.

(Lembrando, ainda não assisti as duas últimas aulas).

Obrigado!

1 resposta
solução!

Olá Arthur,

nesse caso teria que utilizar uma forma de downcasting, ou seja, atribuir a referência do subtipo, que agora esta atribuída a uma variável do supertipo, a uma variável do subtipo . Isso pode ser feito assim:

ClienteComun comum = (ClienteComun) cc.getTitular();

ou

ClienteComum.class.cast(cc.getTitular()).euSouNormal();