Você está na página 1de 6

Programao Orientada a Objetos

2.Herana
Neste captulo explicado o que herana em orientao a objetos e descrito o mecanismo de herana de classes de Java. So apresentados tambm os conceitos de generalizao/especializao, subclasses e superclasses, hierarquias de classes, classes ancestrais e classes descendentes, herana simples e mltipla, subtipo e supertipo, herana de comportamento e herana de implementao. apresentado tambm o modificador de visibilidade protected. Ao final deste captulo o estudante dever ser capaz de fazer distino entre as diferentes formas de herana; definir subclasses em Java e aplicar corretamente esse mecanismo. 2.1. Generalizao/Especializao Uma forma intuitiva que utilizamos para assimilar novos conhecimentos e experincias da vida real atravs de generalizao e especializao de conhecimentos e experincias anteriores. Generalizao/Especializao (generalization/specialization) Uma relao entre um elemento mais genrico e um mais especfico. O mais especfico totalmente consistente com o mais genrico, com alguma propriedade adicional e podendo substitu-lo em qualquer situao. Por exemplo: algum que esteja utilizando um micro computador pela primeira vez procura, naturalmente, identificar semelhanas com outros objetos que lhe sejam familiares. Para algumas pessoas o micro computador ser compreendido como um novo tipo de eletrodomstico que, assim como a televiso, exibe imagens na tela e pode ser ligado ou desligado por meio de um boto. Outras pessoas iro percebe-lo como um novo tipo de equipamento de escritrio que substitui a mquina de escrever. Ainda outras o vero como um hbrido de TV e mquina de escrever. Na figura 7.1 esto representados essas trs formas particulares de se compreender um micro computador, dentre as inmeras possveis, usando a notao da UML. Evidentemente no podemos apontar qualquer uma dessas formas como intrinsecamente "melhor" ou "pior". Cada uma delas possui vantagens e limitaes e sua maior ou menor adequao depende fundamentalmente da bagagem de conhecimentos e experincias prvias de quem a utiliza. Embora nenhuma dessas formas permita, por si s, a plena compreenso de um micro computador, elas reduzem substancialmente o que preciso assimilar como "algo novo". Questes como "De que forma a imagem aparece na tela ?", por exemplo, podem ser satisfatoriamente respondidas por "Tal como numa TV.", ainda que no se saiba exatamente como isso acontea ! 2.2. Mecanismo de Herana Em orientao a objetos, as relaes de generalizao/especializao so implementadas atravs do mecanismo de herana. Herana (inheritance) um mecanismo, pelo qual, elementos mais especficos incorporam estrutura e comportamento de elementos mais genricos. Embora o mecanismo de herana seja uma caracterstica essencial das linguagens de programao orientadas a objetos, os mecanismos das linguagens de programao existentes divergem substancialmente, em aspectos como:

Programao Orientada a Objetos

(i) natureza dos elementos envolvidos numa relao de herana, podendo ser objetos individualmente, classes de objetos ou tipos abstratos de dados, dentre outros; (ii) possibilidade de um elemento incorporar caractersticas "hbridas", de dois ou mais gneros distintos (herana mltipla); (iii) semntica da relao de herana, que determina o que herdado e como combinado com as caractersticas especficas do herdeiro; (iv) forma como a herana implementada, envolvendo questes como visibilidade e proteo entre os elementos relacionados.

Fig. 2.1 - Exemplos de Generalizao / Especializao

2.3. Definio de Subclasses em Java O mecanismo de herana entre classes a definio de subclasses (ou subclassing). Esse mecanismo permite definir uma classe de objetos que herda a estrutura e o comportamento de outra classe j existente. Subclasse, Classe Derivada ou Classe Filha (subclass ou derived class) Numa relao de herana, a classe mais especfica, que herda a estrutura e comportamento da outra classe. Superclasse, Classe Base ou Classe Pai (superclass ou base class) Numa relao de herana, a classe mais genrica, cuja estrutura e comportamento so herdados pela outra classe. Em Java a herana entre classes sempre simples, ou seja: uma subclasse possui uma nica superclasse. As relaes de herana so estticas: a superclasse especificada na definio da subclasse, e no pode ser alterada dinamicamente. Uma subclasse pode estender o comportamento definido para a superclasse de dois modos: modo 1: definio de novos atributos e mtodos, que implementam operaes especficas da subclasse; ou modo 2: redefinio de mtodos herdados da superclasse, especificando novas
2

Programao Orientada a Objetos

formas de implementao para operaes j existentes na superclasse. O comportamento dos objetos da subclasse , portanto, o comportamento definido para os objetos da superclasse com as extenses e modificaes especificadas na subclasse. As relaes de herana de uma classe se propagam para todas as suas subclasses, originando hierarquias de classes onde os atributos e mtodos de uma classe so herdados por todas as classes descendentes. Classe Ancestral (ancestor) a superclasse ou, recursivamente, qualquer classe ancestral da mesma. Classe Descendente (descendant) a subclasse ou, recursivamente, qualquer classe descendente da mesma. A sintaxe de Java para definio de subclasse :
definio-de-subclasse class <nome-de-classe> extends <superclasse> { <definio-de-atributos> // atributos especializados <definio-de-mtodos> // operaes especializadas }

O nome da superclasse fornecido atravs da clusula extends. A definio de atributos e mtodos especializados segue as mesmas regras j apresentadas para definio de classe (Captulo 1). Construtores e Herana Os mtodos construtores so uma exceo regra da herana, pois, no so herdados pelas subclasses. O construtor de uma subclasse tem, obrigatoriamente, que chamar um construtor de sua superclasse em seu corpo. 2.4 Herana e Visibilidade Protegida

Fig. 2.2 Hierarquia de Classes ContaCor/ContaEsp

Suponha o diagrama acima que ilustra a especializao de uma conta corrente bancria (ContaCor) para uma conta especial (ContaEsp). Apesar da herana especificar que os conhecimentos e habilidades da super-classe sero herdados pela sub-classe, nenhum dos atributos da classe ContaCor sero vistos pela classe ContaEsp. Apenas as visibilidades public e protected (quando as classes envolvidas estiverem no mesmo
3

Programao Orientada a Objetos

pacote) sero herdadas. 2.4.1. Visibilidade protegida H situaes, porm, em que queremos oferecer s subclasses algum privilgio de visibilidade, que no deva ser estendido a todas as classes indiscriminadamente. Para isso, utilizamos visibilidade dita protegida (protected). Por exemplo, o mtodo pblico getSaldo(), da classe ContaCor, exige uma senha para que se possa obter o saldo atual da conta. Poderamos querer oferecer s subclasses de ContaCor um acesso mais fcil ao saldo da conta, que no exija aquela senha. Obviamente no haveria sentido que tal acesso fosse pblico, o que seria equivalente a eliminarmos a senha do mtodo getSaldo(). Uma primeira hiptese seria alterarmos a visibilidade do atributo saldoAtual na classe ContaCor para protegida. Isso, porm, violaria recomendaes de segurana no acesso s informaes bancrias dos correntistas. Uma segunda hiptese seria definirmos na classe ContaCor um novo mtodo, com visibilidade protected, que permita obter o valor do saldo, conforme abaixo:
protected float getSaldoAtual() // obtem saldo atual da conta { return saldoAtual; }

Em UML, um atributo ou mtodo protegido precedido pelo smbolo #. 2.4.2. O modificador protected de Java Em Java, a visibilidade protegida mais ampla do que acima descrito, pois o modificador protected de Java a estende tambm s classes pertencentes a um mesmo pacote5, ainda que no sejam subclasses daquela em que o campo ou mtodo definido. Sendo assim, o cdigo apresentado no exemplo acima no suficiente para garantir que o saldo da conta permanea oculto para objetos de outras classes que no sejam subclasses de ContaCor. Para isso, seria necessrio tambm que a classe ContaCor estivesse contida num pacote em que todas as demais classes fossem suas subclasses. Essa caracterstica de Java limita consideravelmente o uso da visibilidade protegida em Java, em comparao com a semntica da visibilidade protegida de C++. Recomendao de projeto: No considere a visibilidade protegida como garantia suficiente de que um mtodo ou atributo no tem visibilidade pblica. 2.5. Emprego Correto de Herana 2.5.1. Herana de comportamento Nos exemplos iniciais d e s t e c ap t u l o , o mecanismo de herana foi utilizado para implementar uma hierarquia de tipos, composta de tipos e subtipos de acordo com a seguinte definio: Subtipo Um tipo S um subtipo de T se e somente se S proporciona pelo menos o comportamento de T. Como vimos na figura 2.2, uma conta especial herda todo o comportamento de uma conta comum e o estende para controlar um limite de crdito adicional ao saldo da conta. Isso significa que podemos tratar uma conta especial como se fosse uma conta comum: todas as operaes vlidas para uma conta comum so tambm vlidas para uma conta especial. Note que o inverso no verdadeiro: no possvel, por exemplo, alterar o limite de uma conta comum, j que esse tipo de conta no apresenta um limite. O uso de herana dessa forma denominado herana de comportamento e s ocorre quando h uma relacionamento verdadeiro de generalizao/especializao entre as duas classes, como no exemplo apresentado. Essa condio considerada
4

Programao Orientada a Objetos

essencial para que o mecanismo de herana seja aplicvel corretamente. 2.5.2. Herana de implementao Outro emprego do mecanismo de herana, que deve ser evitado, a chamada herana de implementao. Nesse caso uma classe herda o comportamento de outra classe mas apenas uma parte desse comportamento vlido para a subclasse. Esse tipo de herana visa reutilizar apenas a implementao da superclasse. Recomendao de projetoN 5 No utilize herana apenas como um mecanismo de reutilizao de cdigo(herana de implementao). Para ilustrar herana de implementao, vamos supor que o Banco possua tambm um plano de capitalizao com contas que s podem receber crditos (depsitos ou rendimentos) e cujo saldo s pode ser resgatado aps um prazo determinado, com o encerramento da conta. A figura 2.3(a) apresenta uma classe para representar tais contas.

Fig. 2.3(a) Projeto da Classe ContaCap Poderamos reutilizar a implementao das contas correntes para as contas de capitalizao, definindo-a como uma subclasse de ContaCor que aproveite parte de sua estrutura de dados e operaes, como na figura 2.3(b).

Fig. 2.3(b) Classe ContaCap Embora isso possa reduzir a tarefa de implementao, as contas de capitalizao seriam vistas tambm como contas correntes, podendo vir, por algum descuido, a participar de operaes exclusivas de contas correntes, como o lanamento de
5

Programao Orientada a Objetos

dbitos, produzindo resultados imprevisveis. Para assegurar que as contas de capitalizao no aceitaro dbitos de valores, a subclasse ContaCap precisa redefinir a operao debitaValor() definida na classe ContaCor, sinalizando essa condio de erro j em tempo de execuo. Um outro aspecto, ainda mais importante, a evoluo das classes relacionadas por herana, j que uma mudana no comportamento de uma superclasse se propaga s suas subclasses. Quando a herana reflete uma relao verdadeira de generalizao/especializao, essas mudanas "em cascata" so, em geral, desejveis e necessrias para manter a integridade do modelo de objetos subjacente aplicao. Quando h apenas uma herana de implementao, onde o relacionamento entre as classes acidental, uma mudana de conceitos da superclasse pode corromper definitivamente a subclasse. Suponha que se deseja adicionar uma nova operao s contas correntes como, por exemplo, transferncia de fundos de uma conta para outra. A incluso dessa operao na classe ContaCor ir se propagar para suas subclasses o que, no caso da classe ContaEsp, seria benfico e simplificaria a manuteno do sistema. Por outro lado, a sua propagao tambm para as contas de capitalizao alteraria o comportamento dessas contas de maneira indesejvel, tornando a manuteno do sistema mais complexa e suscetvel a erros. 7.7. Herana Mltipla Os criadores da linguagem Java optaram por excluir o mecanismo de herana mltipla de classes, embora seja um mecanismo comum em outras linguagens, como C++. A justificativa para essa excluso a possibilidade de ocorrerem diversos conflitos ao utilizarmos esse tipo de mecanismo. Por exemplo: como combinar operaes semelhantes herdadas de superclasses diferentes. As linguagens de programao que admitem herana mltipla de classes adotam diferentes estratgias para resoluo desses conflitos, o que diminui a clareza e a portabilidade de programas que utilizam esses mecanismos. Java, por outro lado, admite a herana mltipla de interfaces, que ser tratada com detalhes mais adiante. Em geral, esse mecanismo substitui com vantagens a herana mltipla de classes.

Você também pode gostar