3. Artigo sobre programação orientada a objetos

download 3. Artigo sobre programação orientada a objetos

of 12

Transcript of 3. Artigo sobre programação orientada a objetos

  • 8/3/2019 3. Artigo sobre programao orientada a objetos

    1/12

    Programao Orientada a Objetos em .NET Parte 1

    por Claudio Lassala

    Para ler todas as matrias da MSDN Magazine, assine a revista no endereo www.neoficio.com.br/msdn[ http://www.neoficio.com.br/msdn.aspx ]

    Qual a importncia de objetos no mundo do .NET? O que devo saber sobre a Programao Orientadaa Objetos (POO) para poder criar programas em .NET? Estas so perguntas comuns entre muitosdesenvolvedores que do seus primeiros passos no mundo do .NET. Entretanto, muitos autores tentamexplicar a POO utilizando exemplos to complicados ou superficiais que o leitor acaba por no entendernem o exemplo e nem o conceito explicado (que por sinal o mais importante!). Neste artigo divididoem duas partes procurarei trazer ao leitor exemplos simples, visando o entendimento claro dosprincipais conceitos da poo_ Apesar de manter o foco em linguagens .NET, grande parte dos conceitospode ser aplicada para qualquer linguagem orientada a objetos.

    A importncia dos Objetos

    No mundo do .NET, objetos so fundamentais e o desenvolvedor deve entend-los, por um simplesmotivo: tudo, isto mesmo, tudo, objeto em .NET. Mesmo strings ou inteiros (integer) so objetos.Tente por exemplo, compilar o cdigo a seguir. Apesar de no obter auxlio do IntelliSense ao digitar. (ponto) aps o inteiro 3, e portanto no ser possvel ver uma lista de mtodos disponveis, o cdigo perfeitamente aceitvel em .NET, e ir compilar e executar sem problemas.

    // Em C#:string teste = 3.ToString(); Em VB.NET:Dim teste as String = 3.ToString()

    Mesmo funes disponveis em VB.NET que aparentemente so funes procedurais esto l apenaspara compatibilidade com verses anteriores da linguagem. Isto significa que ao usar a funo MsgBox,por exemplo, o cdigo compilado ir chamar um mtodo em um objeto, ao invs de usar uma funoprocedural. O mesmo ocorre com os mdulos existentes em VB.NET: os mesmos sero compiladoscomo classes.

    Baseando-se nestes fatos, pode-se ento dizer que objetos so realmente importantes, e odesenvolvedor precisa realmente entend-los para ter fluncia na leitura e escrita de cdigo em .NET.

    Inicio da pagina

    Qual a vantagem?

    Outra pergunta frequente sobre a vantagem em se programar utilizando objetos. Qualquer pessoa ouempresa que vive da criao de software sem dvidas no fica contente ao ver-se escrevendo cdigosimilar infinitamente, gastando tempo e recursos na programao de rotinas que j foram criadasanteriormente, mas que pela falta de uma metodologia apropriada, no podem ser reutilizadas oucustomizadas para suprirem necessidades especficas de cada cenrio. Resumindo, as principaisvantages da POO so o reuso de cdigo e a capacidade de expanso do mesmo.

    Neste momento ainda no comeamos a dissecar os conceitos da POO, e por isso natural que asvantagens da POO no sejam to aparentes.

    Inicio da pagina

    Os alicerces da POO

    Qualquer linguagem orientada a objetos deve oferecer suporte aos seguintes conceitos da POO:

    2010 Microsoft Corporation. All rights reserved.

    Page 1 of 12Programao Orientada a Objetos em .NET Parte 1

    29/08/10http://msdn.microsoft.com/pt-br/library/cc580626(printer).aspx

  • 8/3/2019 3. Artigo sobre programao orientada a objetos

    2/12

    Abstrao

    Encapsulamento

    Herana

    Polimorfismo

    A incapacidade de uma linguagem em suportar qualquer um destes conceitos a desqualifica como umalinguagem orientada a objetos. Sendo estes os alicerces da POO, vamos dissecar cada um deles aseguir.

    Inicio da pagina

    Abstrao

    Abstrao pode ser definida como a capacidade de representar cenrios complexos usando termossimples.

    Pode-se tomar um exemplo da vida real para ilustrar o conceito: um carro uma abstrao de umveculo que um indivduo pode utilizar com o objetivo de mover-se de um ponto a outro. No dia-a-dia,ningum dir: Vou abrir a porta daquele veculo movido a combustvel, entrarei, me sentarei, darei apartida no motor, pisarei na embreagem, engatarei a primeira marcha, acelerarei, controlarei a direoem que o carro ir se mover utilizando o volante. Tamanha explicao no se faz necessria pois todoo conceito daquilo foi abstrado para algo que conhecemos como carro. Apesar de um carro ser algobastante complexo, basta dizer vou usar o meu carro para ir ao trabalho amanh, e qualquer pessoaentender o recado.

    Da mesma forma, imagine a confuso para qualquer pessoa entender a seguinte frase: Quando abroaquele programa em meu computador, surge uma tela que tem vrias caixas retangulares,normalmente brancas, nas quais eu posso clicar dentro e comear a digitar. Algumas dessas caixas jtrazem algo escrito, e outras aparecem completamente vazias. Seria muito mais fcil substituir todaesta explicao apenas dizendo O programa tem uma tela com diversos TextBox. Mais uma vez, ocomplexo objeto que se parece com uma caixa retangular, e permite ao usurio digitar dentro dela

    (alm de possuir outros atributos e aes), foi sabidamente abstrado para a palavra TextBox. Omesmo ocorre com botes de comando, caixas de seleo, grupos de opo, etc. Todos eles soobjetos complexos abstrados para simples termos que todo desenvolvedor utiliza quando precisareferenciar a tais objetos.

    Alm de objetos como aqueles que possuem representao visual (TextBox, Button, Form, etc.),existem tambm objetos que so criados em muitas aplicaes com o intuito de abstrairem objetoscomplexos da vida real, como por exemplo Pedido, Cliente, Produto, e muitos outros. Mas veremosexemplos destes objetos mais adiante.

    Neste ponto importante compreender a diferena entre classe e objeto. Quando mencionado que algocomplexo foi abstrado para algo conhecido como TextBox, este algo uma classe. Uma classe ummodelo para algo que deve ser criado. Por exemplo, quando algum vai fazer um bolo de chocolate,pega-se uma Receita para Bolo de Chocolate, que ser usada como um modelo para o bolo que ser

    criado. De forma anloga, a receita uma classe, e o bolo um objeto.Uma classe no utilizada diretamente. Ningum come a receita de bolo. A classe utilizada somentepara criar objetos baseados nela, e so os objetos que sero realmente utilizados. Deste modo, noutiliza-se a classe TextBox diretamente, e sim os objetos criados a partir daquele classe (caso membrosestticos ou compartilhados venham mente do leitor, no ltimo pargrafo desta seo procuroesclarecer uma confuso que pode surgir com o conceito). A Figura 1 ilustra este conceito. No ladoesquerdo da figura v-se um modelo da classe TextBox, listando alguns de seus membros, como aspropriedades Text, Location, Size, e alguns mtodos como Focus e Copy. Ao lado direito, v-se umForm que faz uso de objetos baseados na classe TextBox.

    Page 2 of 12Programao Orientada a Objetos em .NET Parte 1

    29/08/10http://msdn.microsoft.com/pt-br/library/cc580626(printer).aspx

  • 8/3/2019 3. Artigo sobre programao orientada a objetos

    3/12

    Figura 1. Classes e Objetos

    Por definio, afirma-se que um objeto a instncia de uma classe. Deste modo, na Figura 1 pode-sever que o Form possui trs instncias da classe TextBox. TextBox um exemplo de classe disponvelnativamente no .NET Framework. Em muitos casos necessrio criar classes que no existem noframework, como por exemplo uma classe Produto. Criar classes algo muito simples tanto em VB.NETcomo em C#. O cdigo a seguir mostra a sintaxe necessria em ambas as linguagens.

    // Em C#:public class Produto{} Em VB.NET:Public Class ProdutoEnd Class

    Neste ponto estou omitindo propositalmente a criao de membros para as classes, como propriedadesou mtodos, apenas para manter a clareza do exemplo. Neste artigo existem sees dedicadas amembros de classes. Instanciar classes (ou criar objetos) tambm bastante simples, como pode-sever no seguinte cdigo:

    // Em C#:Produto meuProduto = new Produto(); Em VB.NET:Dim meuProduto as Produto = New Produto()

    O leitor familiarizado com membros compartilhados ou estticos (shared em VB.NET, static em C#,respectivamente) pode questionar minha afirmao de que classes no so utilizadas diretamente,

    visto que tais membros (compartilhados ou estticos) so utilizados sem a necessidade de instanciar aclasse. Isto parte verdade, uma vez que o programador no precisa instanciar a classe manualmente.Entretanto, o runtime do .NET ir instanciar a classe e controlar aquela instncia nos bastidores, entovale a tese de que uma classe utilizada atravs de algum objeto instanciado a partir da mesma.

    Inicio da pagina

    Encapsulamento

    Encapsulamento pode ser definido como a tarefa de tornar um objeto o mais auto-suficiente possvel.

    Na seo anterior, quando o exemplo do carro foi mencionado, de maneira intuitiva deixou-se deabordar os detalhes tcnicos de como o motor de um carro funciona. Existem tantos detalhes a serem

    explicados sobre o funcionamento do motor de um carro que a maioria das pessoas provavelmentedesistiriam de utilizar um carro caso precisassem entender como funciona cada parte daquilo.Basicamente, uma pessoa no precisa daquele entendimento. Apenas saber que o motor o dispositivoque propulciona o carro j o suficiente. A maior parte dos detalhes do motor est encapsuladadentro do mesmo, e pessoas utilizando o carro no precisam lidar diretamente com o motor.

    Page 3 of 12Programao Orientada a Objetos em .NET Parte 1

    29/08/10http://msdn.microsoft.com/pt-br/library/cc580626(printer).aspx

  • 8/3/2019 3. Artigo sobre programao orientada a objetos

    4/12

    Alm disso, importante frisar que o motor de um carro tem um funcionamento indepentende dasoutras partes (tais como direes, pneus, bancos, etc.). Ou seja, mesmo que um carro no tenha asquatro rodas, isto no impede de o motor funcionar, pois ele funciona como uma unidadeindependente, uma caixa-preta.

    Tomando agora o exemplo da caixa de texto em uma tela de um programa, pode-se refletir sobre osdiversos detalhes que esto encapsulados dentro daquele objeto. Por exemplo, o desenvolvedor nosabe examente (ou no precisa saber) como que o sistema operacional ir desenhar a representaovisual daquele objeto na tela, mandando sinais da CPU para a placa de vdeo, e ento para o monitor, eento criando o objeto na posio que foi especificada previamente. Felizmente o desenvolvedor noprecisa se preocupar com este tipo de detalhe. Tudo o que preciso colocar a caixa de texto na tela econfigurar as propriedades Top e Left, para determinar onde o controle dever aparecer. A mgica docomo o controle ir aparecer na tela algo que o objeto auto-suficiente o bastante para fazer aquilosozinho.

    Os conceitos de Abstrao e Encapsulamento andam de mos dadas, visto que com a abstraodefinimos a entidade que representa um objeto complexo, e o encapsulamento esconde detalhesdaquele objeto, e com isto esconde detalhes de seu funcionamento que poderiam assustar a qualquerpessoa tentando utiliz-lo. Imagine se o motorista tivesse que saber a quantidade exata de combustvela ser inserida no carburador quando o acelerador do carro acionado? Acho que eu s andaria denibus, ou de carona.

    Inicio da pagina

    Herana

    Herana pode ser definida como a capacidade de uma classe herdar atributos e comportamento de umaoutra classe.

    Basta um passeio ao redor da cidade para descobrir-se que existem vrios tipos e modelos de carros lfora. Carros de passeio, carros de corrida, carros conversveis, carros com volante do lado esquerdo eoutros do lado direito, carros de diferentes cores, fabricantes, etc. Cada vez que um novo carro criado, no necessrio reinventar a roda, e comear todo um projeto novamente. Diversosconceitos abstrados e encapsulados no objeto carro j foram planejados, testados e aprovados, e porisso no faz sentido gastar-se tempo e recursos para fazer tudo aquilo de novo. Todo carro ter um

    meio de propulso, direo, acelerador e freio, rodas e pneus, e deste modo, todo novo carro podeherdar estas caractersticas e funcionamento de um projeto j existente. Caso seja necessrio criar umnovo carro que seja quase igual a todos os outros, mas que possua algumas coisas diferentes (porexemplo, utilizando um cmbio automtico ao invs de manual), o projetista pode herdar o novo carroa partir do projeto bsico, e ento adicionar as caractersticas especficas do novo carro ao novoprojeto.

    Voltando ao exemplo da caixa de texto: a classe-base da caixa de texto retangular e geralmente temum fundo branco e os caracteres mostrados em preto. Isto suficiente para diversos cenrios, masimaginando-se o cenrio onde faz-se necessria a incluso de uma caixa de texto que dever recebersomente a entrada de nmeros (proibindo a digitao de letras), e dever mostrar o nmero em azulcaso seja positivo e vermelho caso seja negativo, logo percebe-se a necessidade em se criar uma novaclasse. Esta nova classe ser bastante semelhante caixa de texto padro. De fato, semelhante osuficiente para que a mesma seja derivada da caixa de texto padro, e ento as necessidades

    especficas sero definidas nesta subclasse. A Listagem 1 mostra uma possvel implementao em C#para tal classe. A principal diferena para o cdigo em VB.NET seria apenas sintaxe, mas os conceitosso os mesmos.

    Listagem 1. Exemplo de herana

    public class ValorTextBox : System.Windows.Forms.TextBox{protected override void OnTextChanged(EventArgs e){base.OnTextChanged (e);string valor = this.Text.Trim();if (valor.Length == 1 && valor == "-"){// apenas o sinal de negativo foi digitadothis.ForeColor = Color.Red;

    }

    Page 4 of 12Programao Orientada a Objetos em .NET Parte 1

    29/08/10http://msdn.microsoft.com/pt-br/library/cc580626(printer).aspx

  • 8/3/2019 3. Artigo sobre programao orientada a objetos

    5/12

    else{try{// Tenta-se converter a string em um valor decimaldecimal val = Convert.ToDecimal(valor);// Se tiver sucesso, formatar o TextBox para nmeros// positivos e negativos.if (val >= 0)

    this.ForeColor = Color.Blue;else

    this.ForeColor = Color.Red;}

    catch{// Se no foi possvel converter a string em decimal,// cancela o ltimo caracter digitado pelo usurioif (valor.Length > 0)

    this.Text = valor.Substring(0, valor.Length-1);this.SelectionStart = this.Text.Trim().Length;

    }}

    }}

    A primeira linha de cdigo determina que a nova classe chama-se ValorTextBox, e deriva da classeSystem.Windows.Forms.TextBox. Em VB.NET, troca-se os dois-pontos (:) pela palavra-chave Inherits.Todas as caractersticas da classe-base so herdadas ao definir-se que a nova classe herda da mesma.O restante do cdigo apenas implementa o comportamento de validar a entrada de dados do usurio ea formatao diferenciada para valores positivos e negativos.

    Com esta nova classe criada, o prximo passo apenas utiliz-la. O cdigo a seguir mostra trechos decdigo em um Form que utiliza tanto esta nova classe como a classe bsica disponvel no Framework.Os principais pontos a enfatizar no cdigo a seguir so a declarao dos campos que mantm asinstncias dos TextBox e a criao dos objetos baseados nas classes especficas. Pode-se ver que criado um TextBox baseado na classe padro, e dois outros TextBox baseados na classe especializadaValorTextBox criada neste exemplo.

    public class Heranca : System.Windows.Forms.Form

    {private System.Windows.Forms.TextBox textBox1;private MSDNBrasil.ValorTextBox txtValor1;private MSDNBrasil.ValorTextBox txtValor2;// cdigo omitido para clareza do exemplo

    }private void InitializeComponent(){this.textBox1 = new System.Windows.Forms.TextBox();this.txtValor1 = new MSDNBrasil.ValorTextBox();this.txtValor2 = new MSDNBrasil.ValorTextBox();// cdigo omitido para clareza do exemplo

    }O Form em execuo pode ser visto na Figura 2. Os dois primeiros TextBox mostram nossa classeespecializada em ao, enquanto que o terceiro um TextBox bsico. O importante ponto a frisar nautilizao da herana que a classe criada uma vez, e ento utilizada em quantos Forms foremnecessrios. Supondo que em algum momento seja necessrio alterar a aparncia e/ou comportamentode todos os TextBox que utilizam esta classe, basta alterar diretamente na classe e todos os objetosrefletiro a alterao. Por exemplo, ao invs de mostrar os nmeros negativos em cor vermelha, agorao usurio deseja ver os nmeros em letras amarelas, e a cor-de-fundo do TextBox deve passar a servermelha.

    Page 5 of 12Programao Orientada a Objetos em .NET Parte 1

    29/08/10http://msdn.microsoft.com/pt-br/library/cc580626(printer).aspx

  • 8/3/2019 3. Artigo sobre programao orientada a objetos

    6/12

    Figura 2. Herana em ao

    Existem alguns termos utilizados frequentemente, e o leitor precisa estar familiarizado com eles.Chama-se subclasse a classe criada derivada de uma outra classe, a qual por sua vez chamadasuperclasse, ou classe-base. Diz-se tambm que a subclasse uma especializao de sua superclasse,ou ento que a superclasse uma generalizao de suas subclasses.

    Alm disso, a herana definida com um relacionamento -um (ou -uma). Por exemplo, pode-sedizer que o homem -um ser-humano, ou que um calhambeque -um carro, assim como nossa novacaixa de texto especialmente criada para nmeros -uma caixa de texto.

    No se assuste com todos estes termos: com o desenrolar do artigo revisaremos-os, e a compreensoser gradualmente facilitada. A Figura 3 mostra uma representao grfica destes termos. A seta pretaque conecta a classe Homem (SubClasse) classe Humano (SuperClasse) indica que Homem -umHumano. A verde indica que a classe Homem uma especializao da classe Humano, e a seta azulindica que a classe Humano uma generalizao da classe Homem.

    Figura 3. Ilustrando alguns termos importantes

    Inicio da pagina

    Polimorfismo

    Literalmente, polimorfismo significa muitas formas ou o estado de existir em muitas formas. Nomundo da programao, polimorfismo muitas vezes definido como a capacidade de objetosdiferentes possuirem mtodos de mesmo nome e mesma lista de parmetros que quando chamadosexecutam tarefas de maneiras diferentes.

    Estas definies em nada ajudam ao desenvolvedor que est tentando desmistificar o paradigma dapoo_ E sinceramente no conheo nenhuma forma para se explicar polimorfismo usando poucaspalavras, por isso sempre procuro usar bastante analogias e exemplos diversos para ilustrar aexplanao.

    Page 6 of 12Programao Orientada a Objetos em .NET Parte 1

    29/08/10http://msdn.microsoft.com/pt-br/library/cc580626(printer).aspx

  • 8/3/2019 3. Artigo sobre programao orientada a objetos

    7/12

    Seguindo com o exemplo do carro, pode-se dizer que carro -um veculo. Pode-se tambm dizer quemoto -um veculo, e o mesmo vale para bicicleta. Todo veculo possui algum meio para acelerar, noimporta qual mecanismo usado para isso, e o mecanismo geralmente diferente, principalmente secomparado um carro (que usa um motor) uma bicicleta (que usa pedais, corrente e coroa). Colocadoem outras palavras, temos objetos diferentes (carro, moto, bicicleta), que derivam de uma mesmaclasse (veculo). Esta classe possui um mtodo Acelerar, e deste modo, podemos utilizar os diferentesobjetos de modo polimrfico, invocando um mtodo de mesmo nome, mas que possui implementao ecomportamento diferente em cada um dos objetos.

    Um tpico exemplo utilizado na explicao de polimorfismo a criao de formas geomtricas, ouqualquer outro objeto que crie algum tipo de desenho na tela. Considere uma classe base chamadaForma, a qual representa qualquer forma que dever ser desenhada na tela. Esta classe mostrado noseguinte cdigo:

    public abstract class Forma{public Forma(){}public virtual void Desenhar(System.Drawing.Graphics g){}

    }

    A classe Forma marcada com a palavra-chave abstract (indicando tratar-se de uma classe abstrata).Classes abstratas so classes que jamais sero instanciadas diretamente pois no possuemimplementao sufience para oferecer funcionalidades concretas a serem utilizadas. Neste exemplo, aclasse Forma tem o mtodo Desenhar. Este mtodo recebe um objeto do tipo Graphics, o qual ser asuperfcie onde a forma ser desenhada. No h muito que colocar dentro deste mtodo pois cadaforma exige cdigo diferente para ser desenhada. nas classes derivadas da classe Forma que estemtodo ser implementado, e por isso o mtodo marcado como virtual (ou overridable em VB.NET),como pode ser visto no seguinte cdigo, o qual mostra a implementao da classe Circulo.

    using System.Drawing;public class Circulo : Forma{public override void Desenhar(System.Drawing.Graphics g){

    base.Desenhar (g);g.DrawEllipse(Pens.Red, 5, 5, 100, 100);

    }}

    A classe Circulo herda da classe Forma. Esta uma classe concreta, o que significa que pode serinstanciada diretamente, visto que esta classe oferece algum tipo de funcionalidade concreta. O mtodoDesenhar sobrescrito, tendo o cdigo necessrio para desenhar um crculo perfeito na superfciepassada por parmetro ao mtodo. Note que o mtodo na superclasse chamado explicitamente (emC# usa-se base.NomeDoMtodo, enquanto que em VB usa-se MyBase.NomeDoMtodo) . De modosimilar, o seguinte cdigo mostra a classe Quadrado.

    public class Quadrado : Forma{public override void Desenhar(System.Drawing.Graphics g){

    base.Desenhar (g);g.DrawRectangle(Pens.Green, 5, 5, 100, 100);

    }}

    O cdigo para o mtodo Desenhar em ambas as classes Circulo e Quadrado so bastante parecidos pelofato de que ambos fazem uso de mtodos capazes de desenharem elipses e retngulos. Para tornar oexemplo um pouco mais interessante, o seguinte cdigo mostra a classe Pessoa, a qual ter afuncionalidade de desenhar uma pessoa.

    public class Pessoa : Forma{public string Falar(string frase)

    {

    return "Pessoa falando " + frase;}

    Page 7 of 12Programao Orientada a Objetos em .NET Parte 1

    29/08/10http://msdn.microsoft.com/pt-br/library/cc580626(printer).aspx

  • 8/3/2019 3. Artigo sobre programao orientada a objetos

    8/12

    public override void Desenhar(System.Drawing.Graphics g){

    base.Desenhar (g);GraphicsPath pessoa = new GraphicsPath();pessoa.AddEllipse(23, 1, 14, 14);pessoa.AddLine(18, 16, 42, 16);pessoa.AddLine(50, 40, 44, 42);pessoa.AddLine(38, 25, 37, 42);pessoa.AddLine(45, 75, 37, 75);pessoa.AddLine(30, 50, 23, 75);pessoa.AddLine(16, 75, 23, 42);pessoa.AddLine(22, 25, 16, 42);pessoa.AddLine(10, 40, 18, 16);g.DrawPath(Pens.Blue, pessoa);

    }}

    O mtodo Desenhar da classe Pessoa um pouco mais complexo pois necessita de mais cdigo paradesenhar a representao de uma pessoa na superfcie passada ao mtodo. Caso o leitor no estejafamiliarizado com GDI+ (que vem sendo utilizado para criar os desenhos neste exemplo), no sepreocupe: neste momento, o ponto importante salientar que o mtodo Desenhar de cada classeconcreta pode ser bastante diferente entre as classes, ou seja, a implementao pode sercompletamente diferente entre as diversas classes.

    Na classe Pessoa tambm est definido um mtodo Falar. Isto foi feito apenas para enfatizar o fato deque as subclasses da classe Forma podem ter diferentes membros (mtodos, propriedades, etc.), almdaqueles herdados da superclasse. Para a visualizao deste exemplo, foi criado um Form bastantesimples, definido com o cdigo mostrado na Listagem 2 (partes irrelevantes do cdigo foram omitidaspara manter a clareza do exemplo).

    Listagem 2. Form Visualizador

    public class Visualizador : System.Windows.Forms.Form{// Mantm instncia genrica de uma Forma.private Forma forma = null;/// Construtor usado para instanciar o Form,/// j preparando-o para visualizar a Forma correta./// /// Forma que ser desenhada e visualizado no Form.public Visualizador(Forma forma){

    InitializeComponent();// Persiste o objeto passado durante a existncia do Formthis.forma = forma;

    }protected override void OnPaint(PaintEventArgs e){

    base.OnPaint (e);// Mostra o nome da classe sendo visualizada.this.Text = ((Type)this.forma.GetType()).Name;// Invoca o mtodo Desenhar, passando a superfcie// onde a forma ser desenhada.this.forma.Desenhar(e.Graphics);

    }}

    Neste momento, vamos nos concentrar no segundo Form que foi criado (chamadoExemploPolimorfismo), o qual apenas contm um boto chamado btnExecutar, o qual ir instanciar asdiversas Formas e utilizar o Visualizador para mostrar o resultado do mtodo Desenhar de cada umadelas. O cdigo executado quando o boto Executar deste Form clicado, bem como o mtodo-auxiliarMostrar so mostrados no seguinte cdigo.

    private void btnExecutar_Click(object sender, System.EventArgs e){Circulo circ = new Circulo();this.Mostrar(circ);Quadrado quad = new Quadrado();this.Mostrar(quad);Pessoa pes = new Pessoa();

    Page 8 of 12Programao Orientada a Objetos em .NET Parte 1

    29/08/10http://msdn.microsoft.com/pt-br/library/cc580626(printer).aspx

  • 8/3/2019 3. Artigo sobre programao orientada a objetos

    9/12

    this.Mostrar(pes);}private void Mostrar(Forma forma){Visualizador v = new Visualizador(forma);v.Show();

    }

    No h muito segredo no mtodo btnExecutar_Click. As diversas formas so instanciadas e passadaspara o mtodo Mostrar, que toma conta de instanciar o Visualizador e passar a forma como parmetro.O resultado disto mostrado na Figura 4.

    Figura 4. Exemplo de polimorfismo

    Vamos voltar um pouco e dissecar o cdigo da classe abstrata Forma. O Form Visualizador bastantesimples. Um campo privado do tipo Forma declarado na classe com o intuito de manter umareferncia genrica para qualquer tipo de forma passada para ser visualizada. Um construtorespecializado definido para receber referncia para a forma que se deseja visualizar, e persistir estareferncia no campo privado do Form. Note que qualquer tipo de forma pode ser passada (um crculo,um quadrado, uma pessoa, ou qualquer outra forma que venha a ser criada), e por isso necessriodeclarar o tipo atravs do mnimo denominador comum entre estas classes, que neste caso, a

    superclasse Forma.

    O mtodo OnPaint (que ocorre a toda vez que o Form desenhado na tela) recebe um parmetro dotipo PaintEventArgs, e este parmetro possui um membro chamado Graphics, e este membro que passado para o mtodo Desenhar das classes derivadas da superclasse Forma.

    A linha de comando ((Type)this.forma.GetType()).Name (em VB.NET seria CType(this.forma.GetType()).Name) usada apenas para mostrar o nome da classe na barra de ttulo do Form.

    A linha de comando this.forma.Desenhar(e.Graphics) mostra o uso do polimorfismo: diversos tiposdiferentes de objetos (circulos, quadrados, pessoas, etc.) podem ser passados como parmetro paraeste mtodo pois todos estes objetos derivam da classe Forma. Ento, vlido chamar este mtodopassando um crculo, pois crculo -uma forma, e Forma o tipo que o mtodo est esperandoreceber. Apesar de chamar o mesmo mtodo (Desenhar) e passar o mesmo tipo de parmetro

    (Graphics), o resultado de tal operao pode ser bastante diferente, como mostrado na Figura 4.Neste ponto, o uso de polimorfismo possvel porque as classes Circulo, Quadrado e Pessoacompartilham algo em comum: todas elas derivam da superclasse Forma, a qual define o mtodoDesenhar, que neste exemplo, vem sendo usado de maneira polimrfica. Entretanto, existem cenriosonde diferentes objetos precisam ser usados de maneira polimrfica, mas infelizmente eles no soderivados da mesma superclasse.

    Suponha que uma nova classe Funcionario seja adicionada a este exemplo. Esta uma classe denegcios, e portanto, herda de uma superclasse Negocios (em um cenrio real, uma classe deste tipoabstrai operaes normais envolvidas com negcios, como lidar com a validadao de dados do objeto,por exemplo). Esta classe possui um campo do tipo Bitmap que armazena uma foto do funcionrio. Atento, as classe Funcionario e Negocios foram definidas como o cdigo a seguir.

    // Classe base para objetos de negcios.public abstract class Negocios{// Mtodo para validao dos dados mantidos pela classe.public abstract void Validar();

    Page 9 of 12Programao Orientada a Objetos em .NET Parte 1

    29/08/10http://msdn.microsoft.com/pt-br/library/cc580626(printer).aspx

  • 8/3/2019 3. Artigo sobre programao orientada a objetos

    10/12

    }public class Funcionario : Negocios{// Campo que contm foto do funcionrio. Em cenrio real,// possivelmente traramos a foto a partir de um banco de dados ou algo assim. public Bitmap Foto = new Bitmap(@"e:\ClaudioLassala.jpg");public override void Validar(){

    // Cdigo para validao dos dados.}

    }Surge a necessidade de desenhar a foto do funcionrio em uma superfcie, como foi feito com asformas circulo, quadrado e pessoa anteriormente. Por ser uma classe de negcios, a classe Funcionariono pode herdar de qualquer outra classe seno a classe Negocios. Isto significa que a classeFuncionario no possui um mtodo Desenhar, e portanto no compartilha nada em comum com asclasses que sabem como desenhar a si mesmas.

    Como este caso pode ser resolvido? Antes de se precipitar e responder basta adicionar um mtodoDesenhar classe Funcionario, devo mencionar que isto no far com que a classe passe acompartilhar algo em comum com as classes circulo e quadrado, pois ela continua no herdando damesma superclasse, e adicionar um mtodo que porventura tenha o mesmo nome e assinatura (no

    caso do mtodo Desenhar) no ir resolver o problema. A classe pode at ser instanciada e ter seuprprio mtodo Desenhar sendo chamado diretamente, contudo no ser possvel utilizar classegenrica Visualizador, pois lembre-se, aquela classe espera por um objeto que seja-uma Forma, oque no o caso do Funcionario.

    Aqui entra o conceito da Interface. Alm de classes que so subclasses de uma mesma superclasse,pode-se usar polimorfismo com classes que so capazes de fazer algo em comum. Neste cenrio, necessrio utilizar objetos que sejam capazes de desenhar algo que os represente.

    Interface a forma pela qual um objeto permite que outros objetos interajam com ele. Isto muitodiferente da interface visual, que a forma como um ser-humano pode interagir com objetos visuais,tais quais um Textbox, Button, CheckBox, etc.

    Como j foi mencionado, a herana um relacionamento do tipo -um, onde dizemos que uma classe

    -um tipo de outra classe. Interfaces, por outro lado, permitem criar um relacionamento entreobjetos que no seria possvel caso os objetos no herdassem da mesma superclasse. Ao utilizar umainterface, define-se o que uma classe capaz de fazer, ao invs de definir o que uma classe (como no caso da herana).

    Para resolver o cenrio proposto, foi criada uma interface chamada IDesenhavel. convencionadonomear classes comeando com um I masculo (indicando interface), e seguindo com uma ou maispalavras que definam qual a capacidade garantida por aquela interface. Neste caso, objetos queimplementam esta interface podem ser interpretados como classes desenhveis (este padro usadono .NET Framework, como nas interfaces IDisposable, IComparable, IEnumerable, etc.). Veja no cdigoa seguir a interface IDesenhavel.

    public interface IDesenhavel{void Desenhar(Graphics g);

    }A interface IDesenhavel possui apenas um membro, que o mtodo Desenhar. Todos os membros deuma interface sero sempre pblicos pois uma interface como um contrato, e toda classeimplementando esta interface deve saber exatamente quais so as clusulas (membros) destecontrato para que possa satisfazer a todos os detalhes.

    O prximo passo alterar as classes Funcionario e Forma, de modo que estas classes implementem ainterface IDesenhavel. O cdigo seguinte mostra em negrito as principais alteraes (partesirrelevantes com relao interface foram omitidos pra manter a clareza do exemplo).

    public class Funcionario : Negocios, IDesenhavel{#region Membros da Interface IDesenhavelpublic void Desenhar(Graphics g){

    // Carrega a foto em um objeto Image.Image im = Image.FromHbitmap(this.Foto.GetHbitmap());

    Page 10 of 12Programao Orientada a Objetos em .NET Parte 1

    29/08/10http://msdn.microsoft.com/pt-br/library/cc580626(printer).aspx

  • 8/3/2019 3. Artigo sobre programao orientada a objetos

    11/12

    // Desenha a foto na superfcie do grfico.g.DrawImage(im, 1, 1, im.Width, im.Height);}

    #endregion}public abstract class Forma : IDesenhavel{public virtual void Desenhar(System.Drawing.Graphics g){}

    }Note que a classe Funcionario, alm de herdar da classe Negocios, agora tambm implementa ainterface IDesenhavel. Em .NET, herana-mltipla no suportada, portanto cada classe pode herdarde apenas uma superclasse, mas no entanto pode implementar qualquer nmero de interfaces. Vistoque a interface IDesenhavel possui o mtodo Desenhar, a classe Funcionario passa automaticamente aser obrigada a implementar tal mtodo (naquele mtodo est o cdigo necessrio para utilizar o bitmapque possui a foto do funcionrio e desenhar aquela imagem na superfcie). Caso deixe de implementaro mtodo, um erro ser acusado pelo compilador, o que proibir a compilao do cdigo.

    No caso da classe Forma, foi adicionada a informao de que aquela classe implementa a interfaceIDesenhavel, e como j existia um mtodo Desenhar em conformidade com aquele definido nainterface, nada mais precisou ser alterado. Lembre-se que as classes Circulo, Quadrado e Pessoa

    herdam da classe Forma, e portanto, no necessrio alterar quelas classes, pois a informao dequais interfaces so implementadas tambm herdada para as subclasses.

    Outra importante alterao a mudana do tipo utilizado no Visualizador e no FormExemploPolimorfismo. Basicamente, ao invs de fazer referncias a objetos do tipo Forma, passa-se areferenciar a objetos que implementam IDesenhavel. A Listagem 3 mostra em negrito as alteraes emambos os Forms (mais uma vez, cdigo irrelevante neste contexto foi omitido).

    Listagem 3. Programando para a interface

    // Form Visualizador.public class Visualizador : System.Windows.Forms.Form{// Mantm instncia genrica de objeto que implementa IDesenhavel.private IDesenhavel forma = null;////// Construtor usado para instanciar o Form,/// j preparando-o para visualizar a Forma correta////// Objeto que ser desenhado/// e visualizado no Form.///public Visualizador(IDesenhavel objeto){

    InitializeComponent();// Persiste o objeto passado durante a existncia do Formthis.forma = objeto;

    }}// Form ExemploPolimorfismo.public class ExemploPolimorfismo : System.Windows.Forms.Form{private void btnExecutar_Click(object sender, System.EventArgs e){Circulo circ = new Circulo();

    this.Mostrar(circ);Quadrado quad = new Quadrado();this.Mostrar(quad);Pessoa pes = new Pessoa();this.Mostrar(pes);Funcionario fun = new Funcionario();this.Mostrar(fun);

    }private void Mostrar(IDesenhavel objeto){

    Visualizador v = new Visualizador(objeto);v.Show();

    Page 11 of 12Programao Orientada a Objetos em .NET Parte 1

    29/08/10http://msdn.microsoft.com/pt-br/library/cc580626(printer).aspx

  • 8/3/2019 3. Artigo sobre programao orientada a objetos

    12/12

    }}

    Alm das alteraes onde trocou-se o tipo Forma para o tipo IDesenhavel, foi adicionado cdigo parainstanciar a classe Funcionario e passar o objeto para o mtodo Mostrar. A Figura 5 mostra o resultadode todas estas alteraes.

    Figura 5. Polimorfismo em ao

    Refrescando a mente: usando o conceito de polimorfismo podemos ter objetos diferentes que possuamalgum mtodo de mesmo nome e assinatura, e chamar estes mtodos de modo genrico:Objeto.Mtodo(parmetros).

    E o resultado poder ser bastante diferente, dependendo da forma como cada objeto implementa aoperao. Isso possvel para objetos que tenham um relacionamento estabelecido pelo fato de

    herdarem de uma mesma subclasse, ou implementarem uma interface em comum.

    Inicio da pagina

    Concluso

    Nesta parte deste artigo, vimos que objetos so importantes em .NET pelo simples fato de que tudoem .NET objeto. Por isto, uma clara compreenso da Programao Orientada a Objetos (POO) necessria para que o desenvolvedor escreva e leia cdigo fluentemente. Vimos que os quatroprincipais alicerces da POO so: Abstrao, Encapsulamento, Herana e Polimorfismo, sobre os quaisvimos os conceitos e simples exemplos para ilustrar aos conceitos.

    Na prxima parte deste artigo continuaremos investigando mais sobre poo_ At o prximo ms!

    Claudio Lassala ([email protected]) Desenvolvedor Senior da EPS Software Corp., emHouston, TX. palestrante freqente em grupos de usurios, seminrios e conferncias na Amrica doNorte e Brasil. MVP C#.NET, MCSD for .NET, e colunista na MSDN Brasil. Criou e apresentou vriostreinamentos em vdeo para o Universal Thread, e tem artigos publicados em diversas revistasinternacionais. Bio completa: www.lassala.net/bio

    OLHO: objetos so fundamentais e o desenvolvedor deve entend-los, por um simples motivo: tudo,isto mesmo, tudo, objeto em .NET

    Inicio da pagina

    Page 12 of 12Programao Orientada a Objetos em .NET Parte 1