Entendendo POO (História e conceitos)
Sabemos que Java, C++ e Object Pascal são linguagens Orientadas a Objetos, mas sabemos o que isso significa? Entenda de uma forma dinâmica e objetiva os conceitos e as características dessa poderosa ferramenta.
Parte 2: Características
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.