Herança
Objetos de uma mesma classe podem tirar proveito de relações de herança, onde objetos
recém-criados absorvem características de outros já existentes e adicionam-se novas
características. Um exemplo disso, sem fugir do nosso exemplo anterior, são os livros.
Na verdade, eles são blocos de papéis que possuem capas e apresentam algum conteúdo
em suas páginas. Os livros herdaram as características dos "blocos de papéis", como
quantidade de folhas, flexibilidade, etc e foi adicionada a opção de ter uma capa e
um conteúdo. Assim fica fácil de entender né? ;)
Polimorfismo
Pensemos agora um pouco em relação ao grupo dos objetos animados. Peguemos a Carla,
que é um objeto da classe criança. Andar é um de seus métodos certo? É certo que não é
um andar muito bonito, se apóia aqui, se apóia ali, mas cumpre o seu objetivo que é
ir do ponto A para o ponto B.
Já o pai dela, o João, que é um objeto da classe adulto, tem o mesmo método, que é
também Andar. Ele vai de um ponto A para o ponto B sempre que desejar, com a diferença
que seus passos são firmes. O método é o mesmo nos dois casos, mas com ele funciona
diferente. É para isso que existe o polimorfismo, para que isso possa ser implementado.
Já viu como está o nosso mundo? Temos João, que é um Adulto, temos a pequena Carla, que
é uma Criança. Ambos são seres vivos, e por causa da característica de serem seres
vivos fazem parte do grupo dos objetos animados. Só que a Carla adora desenhar e de
presente posso dar para ela o Caderno, que é um objeto da classe dos
"blocos de papéis", que por sua vez faz parte do grupo dos objetos inanimados. Mas
poxa, como ela vai escrever? É para isso que existem os construtores.
Um construtor é um método que permite criar um objeto à custa de uma determinada
classe. Tendo conhecimento de como criá-lo, eu faço criar um objeto que eu quero chamar
de Lápis. Ele vai ser de uma classe chamada "escrevedores" (foi mal, mas não achei um
nome melhor) que também fará parte dos objetos inanimados. Agora sim, Carla pode brincar
à vontade com o seu lápis e o seu caderno, podendo desenhar quando quiser.
Viu como no mundo da POO tudo está relacionado? Eu diria que é um pouco de
brincar de Deus... Algo poderoso quando se tem o conhecimento necessário! :)
Encapsulamento
Digamos que o objeto animado João é um médico. Ser médico é um de seus atributos. Todos
os dias ele vai trabalhar em seu A4 preto, o carro mais potente do mundo (eita mentira
né?). João sabe que para fazer o carro andar ele precisa somente colocar a chave, girá-la
e o carro liga, daí é só pisar no acelerador para começar a se locomover. Mas,
será que ele, com o seu nulo conhecimento em mecânica, sabe o que acontece quando ele
gira a chave? Duvido! E é isso que quer dizer o encapsulamento. João pode não sabe como
seu carro funciona, mas sabe como fazer funcionar.
Logo, o encapsulamento é o processo pelo qual se escondem os detalhes de
implementação nas Classes. Além disso, é importante frisar que o motor de um carro tem
um funcionamento independente das outras partes, como direção, pneus, bancos, etc. Ou
seja, mesmo que um carro não tenha as quatro rodas, isto não impede de o motor funcionar,
pois ele funciona como uma unidade independente, uma "caixa-preta".
Que tal um outro exemplo mais prático? Está vendo essa tela? O campo para busca, os botões
no menu, esse texto em si? Você não sabe como eles estão aqui, o que existe por trás
dessa tela, mas sabe que existe toda uma implementação que nos foi escondida (ainda bem
né? ;P)... Entendeu?
E, finalmente, a...
Abstração
Criamos um mundo - bem diferente do real, é verdade, mas nele podemos brincar à vontade -
com seus objetos, suas classes, seus comportamentos. Esse ato de representar cenários
complexos com termos simples, de imaginar o mundo como um conjunto, de dividir os objetos
para melhor classificá-los, de dar características e métodos, é o que chamamos de abstração.
É graças à abstração que podemos pensar em praias em vez de grãos de areia, em trânsito
em vez de um só carro, em florestas em vez de árvores... Enfim, é através da abstração
que podemos imaginar a lógica necessária para entender o nosso problema e montar a sua
solução. Com a abstração vem uma maior facilidade de utilização da classe, diminuição
da probabilidade de enganos, aumento na rapidez do desenvolvimento e melhoria na
legibilidade do código.