Herança
Outro pilar da POO é a herança. Assim como no mundo real, a herança na POO também diz respeito à ação de herdar. Ela nada mais é do que um objeto poder ser criado em uma outra classe, levando consigo todos os atributos já existentes em sua classe de origem.
A herança é uma maneira de reutilizar o código já existente em uma nova classe. Desta forma, o código é aprimorado com novas e melhores capacidades. Ao utilizar este pilar, os programadores economizam tempo de desenvolvimento de um programa, já que eles reutilizam códigos já testados e aprovados.
No organograma abaixo, mostra um exemplo de herança. Ao analisá-la, percebe-se que as classes herbívoro, carnívoro e onívoro podem herdar quaisquer atributos necessários da classe animal: tamanho, raça, cor etc. Da mesma forma, as classes leão, hiena, homem e coelho podem herdar atributos das classes herbívoro, carnívoro ou onívoro.
Saiba Mais
O conceito de herança é um dos conceitos fundamentais de POO. Herança, na prática, significa a possibilidade de construir objetos especializados que herdam as características de objetos mais generalistas, ou ainda, a herança uma maneira de reutilizar código a medida que podemos aproveitar os atributos e métodos de classes já existentes para gerar novas classes mais específicas que aproveitarão os recursos da classe hierarquicamente superior
.
O conceito de herança mimetiza as características hierárquicas de vários sistemas reais, como por exemplo, os sistemas de classificação em biologia que, pode determinar como uma hierarquia o seguinte:
- animais;
- vertebrados e invertebrados;
- mamíferos e aves;
- entre outras características mais específicas
Outras hierarquias são possíveis, por exemplo, na área da saúde a hierarquia dos agentes envolvidos poderia ser esta: pessoas, (empregados, terceirizados e pacientes), (médicos, biomédicos, enfermeiros...), (pacientes particulares, pacientes SUS) e assim, mais uma vez, a caminho de classes
mais especializadas.
Notem como estas hierarquias podem ser facilmente descritas numa estrutura de árvore. Nesta estrutura a raíz da árvore é o agente da qual originam todos os outros agentes. Podemos dizer que cada agente herda as características dos seus antecessores.
Na visão POO podemos afirmar que pessoas
é uma classe hierarquicamente superior e que dela são herdadas características para a formação de novas classes, como: empregados
, pacientes
, entre outras.
Superclasses e subclasses
Em POO todo objeto de uma classe construída pelo usuário da linguagem é também um objeto de outra classe. Podemos afirmar isso pois, por exemplo, em Java existe um objeto de qual todas as classes são originadas que é o Object.
Por exemplo, na hierarquia da área da saúde, podemos dizer que pessoa
é uma superclasse e que empregados
é uma subclasse de pessoa
.
A herança normalmente produz subclasses mais especializadas, mais específicas, que as superclasses. Notem que, o termo subclasses
pode trazer a idéia errada de que uma subclasse possa ter menos recursos que a superclasse mas ocorre exatamente o inverso, uma subclasse é mais especializada que a superclasse.
Guardem bem esta máxima:
Uma subclasse guarda a relação é um
com a superclasse.
Herança simples e herança múltipla
Nossos cometárioa até o momento basearam-se num esquema de herança chamada de herança simples em que um objeto herda características somente de uma superclasse. No entanto, o conceito de herança não é tão restritivo assim, como em muitos casos da natureza, o conceito em si permite a herança múltipla, artifício que permite a um objeto herdar as características de mais de uma superclasse.
A herança múltipla é muito controversa na Computação pois pode gerar algumas situações intrincadas, para não dizer confusas. O ponto principal da discussão é que as subclasses são classes mais especializadas que as superclasses assim, herdar características muito específicas de outras classes que também podem ser específicas pode gerar mais dúvidas do que soluções. A herança oferece um poder imenso em POO mas lembrem-se que as agregações também.
Um dos problemas clássicos de ambiqüidade e complexidade apontados pela herança múltipla é o problema do diamante, como mostrado na figura abaixo (fonte: Wikipidia domínio público):

Na figura acima as classes B e C herdam de A, ou seja, são mais especializadas. Destas duas subclasses é gerada uma nova classe, D, que herda de B e C. Estranho mas é possível. Pergunta-se: se chamamos um método em D, conhecido em A por herança, de onde virá esta herança, de A ou de B?
Algumas linguagens de programação, como Java, resolvem este problema do seguinte modo: definem que uma classe pode herdar características de interface múltiplas mas compromete-se só com herança simples.
Herança dos rótulos
Até agora vimos que os membros (atributos e comportamentos) de uma classe poderiam ser rotulados como public ou private. Com a inclusão do conceito de herança podemos apresentar um novo rótulo, o protected.
O rótulo protected permite que os membros das subclasses, ou de outras classes de um mesmo pacote, podem acessar os membros protected da superclasse.
Em Java uma subclasse não pode acessar diretamente os membros private de uma superclasse. Se isso fosse possível acabaria com os benefícios do ocultamento de informações.
Vejam que o rótulo protected serve como uma proteção intermediária entre os rótulos private, bastante restritivo, e public, aberto.
Mas o conceito de herança não tem só vantagens. Notem que um software mal projetado pode fazer com que uma subclasse possa herdar recursos que não seriam apropriados para ela. Este efeito de propagação de recursos pode ter efeitos interessantes se bem planejados mas destrutivos se mal planejados.
A herança promove a proparagação de TODOS os recursos.

Comentários
Postar um comentário