16 janeiro 2009

SCJP - 02 - Herança e relações TEM-UM e É-UM

Olá, meus caros! Estou eu aqui continuando com os meus estudos (parcos e espaarsos) para a certificação (cujo voucher eu nem adquiri ainda). O engraçado é que a gente passa por alguns tópicos, acha que sabe tudo sobre eles, e é induzido inconscientemente a pulá-los. Conselho: não façam isso :D Lendo o primeiro tópico do segundo capítulo, me deparei com dois conceitos. IS-A (é um) e HAS-A (tem um). Não, minha gente, isso não tem nada a ver com métodos acessores (getters e setters), ou com coleções (contains()). Isso tem mais a ver com UML :) Como nós programadores java sabemos, existe uma palavra chave chamada instanceof, que nos diz se um objeto é instância de uma determinada classe.



class Veiculo implements Serializable{}

class Carro extends Veiculo {}

public class Teste {
  public static void main(String[] args) {
      Carro carro = new Classe();
      if (carro instanceof Carro ) {
          System.out.println("carro é uma " +
                  "instância de Carro");
      }

      if (carro instanceof Veiculo) {
          System.out.println("carro é uma " +
                  "instancia de Veiculo");
      }

      if (carro instanceof Serializable) {
          System.out.println("carro é uma " +
                  "instancia de Serializable");
      }

      if (carro instanceof Object) {
          System.out.println("carro é uma " +
                  "instancia de Object");
      }
  }
}
A gente já sabe qual vai ser a saída disso ai em cima né? Isso mesmo. Todas as saídas de texto vão ser exibidas. Com isso, a gente diz que se Carro herda de Veiculo, então um Carro é um (IS-A) Veículo. E como Veiculo implementa Serializable, então Veiculo também IS-A Serializable (eu escolhi essa interface porque eu não tava com muito saco de implementar métodos :)) Para o HAS-A, dêem uma olhada no código abaixo:
class Banco {
  private Conta conta;
  public void deposito(Double valor) {
      conta.deposito(valor);
  }
}

class Conta {
  public void deposito(Double valor) {
      //Faz o deposito
  }
}
Neste caso, nós dizemos que um Banco tem uma (HAS-A) Conta porque a classe Banco tem uma referência para um objeto da classe Conta, e nada mais. Assim, um Banco pode invocar os métodos de uma Conta e ter o comportamento de uma Conta sem ter qualquer relação com seu código. Talvez vocês me dissessem: "ah, mas isso são só conceitos, não são aplicados assim tão frequentemente..." Bem, tem certeza? Dá uma olhada no padrão de projeto Business Delegate então... Em suma, esse padrão funciona como um ponto de acesso entre a camada de visualização (seja numa aplicação web, desktop, mobile, etc) e a camada de negócios. O que este padrão é, senão um exemplo de utilização do conceito HAS-A? ;) E quanto ao IS-A? Você nunca se deparou com a situação abaixo?
import java.util.List;
import java.util.ArrayList;

class Veiculo{}

class Carro extends Veiculo {}

public class Teste {
  public static void main(String[] args) {
      List<Veiculo> veiculos =
              new ArrayList<Veiculo>();

      veiculos.add(new Veiculo());
      veiculos.add(new Carro());
  }
}
Carro é um Veiculo, e por isso, ele pode ser adicionado à lista sem problemas. O casting da subclasse para a superclasse é feito automaticamente, e é o conceito de IS-A que justifica isso. Pois é, minha gente... Tem muito conceito que a gente até sabe, devido ao nosso trato diário com a linguagem, mas que a gente precisa formalizar, pra poder aplicar no exame :)


Creative Commons License
Esta obra está licenciada sob uma Licença Creative Commons.
Comentários
0 Comentários

0 comments:

Postar um comentário

Regras são chatas, mas...

- Seu comentário precisa ter relação com o assunto do post;
- Em hipótese alguma faça propaganda de outros blogs ou sites;
- Não inclua links desnecessários no conteúdo do seu comentário;
- Se quiser deixar sua URL, comente usando a opção OpenID;
- CAIXA ALTA, miguxês ou erros de ortografia não serão tolerados;
- Ofensas pessoais, ameaças e xingamentos não são permitidos;