Programação Orientada a Objetos: uma introdução | POO | Programando Fácil - Mudando o Curso da sua vida | DVD Asp.net, Cursos de programação, Cursos em DVD, Vídeo aulas, Tutoriais de programação, CSS, HTML, Javascript e treinamentos.
« Web.Config : Forms Authentication
MÉTODOS E ESCOPO »
Outras são mais "puras", sendo construidas do zero focando-se sempre nas idéias por trás da orientação a objetos como é o caso das linguagens Smalltalk, Self e IO, onde TUDO é orientado a objetos.
Uma mensagem é um pequeno texto que os objetos conseguem entender e, por questões técnicas, não pode conter espaços. Junto com algumas dessas mensagens ainda é possível passar algumas informações para o objeto (parâmetros), dessa forma, dois objetos conseguem trocar informações entre si facilmente.
Ficou confuso? Vamos a um exemplo prático: imagine que você está desenvolvendo um software para uma locadora e esta locadora tem diversos clientes. Como estamos tentando modelar um sistema baseado no sistema real, nada mais obvio do que existirem objetos do tipo Clientes dentro do nosso programa, e esses Clientes dentro do nosso programa nada mais serão do que objetos que "simulam" as características e ações no mundo virtual que um cliente pode realizar no mundo real.
É normal não entender isso logo de cara, mas os conceitos de classes e subclasses são relativamente simples: Tente pensar no conceito de Classes utilizado na Biologia: um animal é uma classe, e tem suas características: é um ser vivo capaz de pensar, precisa se alimentar para viver, etc, etc. O Ser Humano é uma sub-classe dos animais. Ele tem todas as características de um animal, mas também tem algumas peculiaridades suas, não encontradas nas outras sub-classes de animais. Os pássaros também são animais, mas possuem características próprias.
Note que uma Classe não tem vida, é só um conceito. Mas os Objetos (animais, serem humanos, pássaros, etc) possuem vida. O seu cachorro rex é um Objeto (ou instância) da classe Cachorro. A classe Cachorro não pode latir, não pode fazer xixi no poste, ela apenas especifica e define o que é um cachorro. Mas Objetos do tipo Cachorro, estes sim podem latir, enterrar ossos, ter um nome próprio, etc.
A criação de uma nova Classe é dividida em duas partes: os seus atributos e os seus métodos. Os atributos são variáveis que estarão dentro de cada um dos objetos desta classe, e podem ser de qualquer tipo. Por exemplo, a classe Cachorro poderá ter o atributo nome que será do tipo String. Assim, cada Objeto desta classe terá uma variável própria chamada nome, que poderá ter um valor qualquer (Rex, Frodo, Atila, …).
Métodos serão as ações que a Classe poderá realizar. Quando um objeto desta classe receber uma mensagem de algum outro objeto contendo o nome de um método, a ação correspondente a este método será executada. Por exemplo, caso um objeto da classe Dono envie uma mensagem para um objeto do tipo Cachorro falando "sente", o cachorro irá interpretar esta mensagem e conseqüentemente irá executar todas as instruções que foram especificadas na classe Cachorro dentro do método sente.
Um construtor tem uma função especial: ele serve para inicializar os atributos e é executado automaticamente sempre que você cria um novo objeto.
Quando você especifica os atributos de uma classe, você apenas diz ao sistema algo como "objetos desta classe Pessoa vão ter uma variável chamada Nome que é do tipo String, uma variável chamada idade que é do tipo inteiro, etc, etc". Mas estas variáveis não são criadas, elas só serão criadas no construtor. O construtor também pode receber parâmetro, desta forma, você pode passar para o construtor uma String contendo o nome da Pessoa que você está criando, sua idade, etc. Normalmente, a sintaxe é algo parecido com isto:
Pessoa joao := new Pessoa( "João", 13 );
Este código gera um novo objeto chamado joao que é do tipo Pessoa e contem os valores "João" como nome e 13 como idade.
Caso você tenha entendido o texto acima, você entendeu 99% do que esta por trás da orientação a objetos. O mais importante é entender como funciona a comunicação entre os objetos, que sempre segue o seguinte fluxo:
Note o tempo verbal empregado ao descrever os métodos. Fica fácil perceber que trata-se de ações que um Cliente pode realizar.
Em seguida, criamos 2 classes que são filhas da classe Pessoa, chamadas PessoaFisica e PessoaJuridica. Tanto a classe PessoaFisia como a PessoaJuridica herdariam os atributos da classe Pessoa, mas poderiam ter alguns atributos a mais.
A classe PessoaFisica pode ter por exemplo o atributo RG enquanto a classe PessoaJuridica poderia ter o atributo CNPJ.
Dessa forma, todos os objeto da classe PessoaFisica terá como atributos:
Um dos conceitos mais complicados de se entender, e também um dos mais importantes, é o Polimorfismo. O termo polimorfismo é originário do grego e significa "muitas formas".
Desta forma, a mensagem "fale" enviada a um objeto da classe Animal pode ser interpretada de formas diferentes, dependendo do objeto em questão. Para que isto ocorra, é preciso que duas condições sejam satisfeitas: exista herança de uma classe abstrata e casting (outras situações também podem resultar em polimorfismo, mas vamos nos centrar neste caso).
Herança nos já definimos previamente, mas o que é uma classe abstrata? E o que é esse tal de casting?
Uma classe abstrata é uma classe que representa uma coleção de características presentes em vários tipos de objetos, mas que não existe e não pode existir isoladamente. Por exemplo, podemos criar uma classe abstrata chamada Animal. Um Animal tem diversas características (atributos) e podem realizar diversas ações (métodos) mas não existe a possibilidade de criarmos objetos do tipo Animal. O que existem são objetos das classes Cachorro, Gato, Papagaio, etc. Essas classes, estendem a classe Animal herdando todas as suas características, e adicionando algumas coisas a mais. "Animal" é só uma entidade abstrata, apenas um conjunto de características em comum, nada mais.
Você pode olhar para um objeto da classe Cachorro e falar "isto é um animal, pois estende a classe Animal", mas você nunca vai ver um objeto que seja apenas da classe Animal, pois isso não existe! É como eu olhar para você e falar "você é um objeto da classe SerVivo". Essa afirmação está correta, mas você na verdade é um objeto da classe SerHumano, que por sua vez herda todas as características da classe SerVivo (que por sua vez é uma classe abstrata, já que não podemos criar algo que seja apenas classificado como "SerVivo", sempre vamos classifica-lo de forma menos genérica).
Nunca esqueça disso: você nunca vai poder criar um objeto do tipo de uma classe abstrata. Sempre crie objetos das classes que estendem esta classe abstrata.
Já o termo casting é utilizado quando nos forçamos o sistema a ver um certo objeto como sendo de um determinado tipo que não é o seu tipo original. Supondo que temos a situação a seguir:
Essa é uma representação na notação UML (Unified Modeling Language) que nos informa que existe a definição de três classes em nosso sistema: existe a classe abstrata Animal (note que ela está em itálico, isso significa na notação UML que trata-se de uma classe abstrata) e existem também outras duas classes chamadas Cachorro e Gato, que são filhas da classe Animal. Ou seja, todo objeto das classes Cachorro e Gato vão ter todas as características (atributos e métodos) presentes na classe Animal, e mais algumas características próprias.
Imagine que vamos criar um sistema de cadastro de animais. Vamos, por questões didáticas, supor que todos os animais de nosso sistema fiquem armazenados em um array. Então existiria um array contendo objetos dos tipos Gato e do tipo Cachorro. Mas armazenar diversos tipos diferentes de objetos em um único array não é uma boa idéia, pois depois, para extrair essas informações de volta é bastante complicado. Mas pare e pense por um instante: objetos do tipo Cachorro e objetos do tipo Gato são também objetos do tipo Animal, correto? Bom, então podemos criar um array capaz de armazenar Animais! Assim nossa vida fica bem mais fácil, bastando atribuir ao array os objetos (do tipo Cachorro e Gato – que estendem a classe Animal) que queremos guardar. Em forma algorítmica, seria mais ou menos:
listaDeAnimais[0] = new Cachorro("Frodo"); // Criamos um novo objeto do tipo Cachorro com o nome Frodo e armazenamos no array
listaDeAnimais[1] = new Gato("Alan"); // Criamos um novo objeto do tipo Gato com o nome Alan e armazenamos no array
Certo! Agora temos um array com vários objetos do tipo Animal. Agora vamos fazer um looping por todos esses objetos, enviando para cada um deles a mensagem "fale". O que iria acontecer?
Inicialmente, vamos supor que a classe abstrata Animal possui o método "fale", e que ele seja implementado (de forma algorítmica) da seguinte forma:
Desta forma, todo objeto que de alguma classe que estenda a classe Animal vai ter automaticamente o método "fale", e isso inclui todos os objetos das classes Cachorro e Gato. Mas todos eles, atualmente, ao receber a mensagem "fale" vão responder imprimindo na tela a mensagem "Eu sou mudo!". Mas Gatos e Cachorros podem falar! O que podemos fazer é sobreescrever o método fale para cada uma das classes, substituindo então seu conteúdo pelo comportamento que queremos que cada subclasse tenha.
Agora, se fizermos um looping entre todos os objetos contidos em nosso array criado anteriormente enviando para cada objeto a mensagem "fale", cada um deles irá ter um comportamento diferente, dependendo se é um Cachorro ou um Gato. Nosso looping entre todos os animais cadastrado no nosso sistema seria mais ou menos assim:
Isto é polimorfismo! Uma mesma mensagem é enviada para diferentes objetos da mesma classe (Animal) e o resultado pode ser diferente, para cada caso.
Espero que com este texto você tenha ao menos entendido o básico da orientação a objetos. Não se preocupe caso você tenha "viajado" em algumas partes do texto, é perfeitamente normal. Agora siga em frente, continue estudando e leia um bom livro sobre a linguagem de programação que quer aprender. Caso esteja dando seus primeiros passos no mundo orientado a objetos, um bom começo pode ser a linguagem Ruby. Ela é uma linguagem interpretada e bastante fácil de aprender, e ainda assim, possui um bom sistema de orientação a objetos, sendo um ótimo ambiente para começar. Além disso, Ruby é uma linguagens que vem crescendo bastante no mercado, sendo que tem se destacado bastante no desenvolvimento de softwares para web, substituindo linguagens como como PHP, Perl e Java.
'Orientacao a objetos é bem legal!   Até a próxima!' out.
Marcio Frayze David é formado em Ciência da Computação pela PUC-SP e trabalha com desenvolvimento de softwares utilizando Java (J2SE, J2ME e J2EE) e Smalltalk. Ele também é membro do grupo Insaners, que desenvolve jogos open-source para Windows, Linux e celulares. Nas horas vagas gosta de sair com sua namorada e tocar bateria. Pode ser contactado através do email "mfdavid em gmail.com" ou em seu blog.
Imprimir artigo Este artigo foi escrito por Romulo Reis em 12 de maio de 2011 às 9:11, e está arquivado em POO. Siga quaisquer respostas a este artigo através do RSS 2.0. Você pode deixar uma resposta ou fazer um trackback do seu próprio site.