Anda di halaman 1dari 12

Programao Orientada a Objetos em .

NET Parte 1

Page 1 of 12

2010 Microsoft Corporation. All rights reserved.

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 Orientada a Objetos (POO) para poder criar programas em .NET? Estas so perguntas comuns entre muitos desenvolvedores que do seus primeiros passos no mundo do .NET. Entretanto, muitos autores tentam explicar a POO utilizando exemplos to complicados ou superficiais que o leitor acaba por no entender nem o exemplo e nem o conceito explicado (que por sinal o mais importante!). Neste artigo dividido em duas partes procurarei trazer ao leitor exemplos simples, visando o entendimento claro dos principais conceitos da poo_ Apesar de manter o foco em linguagens .NET, grande parte dos conceitos pode 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 simples motivo: 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 apenas para 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 funo procedural. O mesmo ocorre com os mdulos existentes em VB.NET: os mesmos sero compilados como classes. Baseando-se nestes fatos, pode-se ento dizer que objetos so realmente importantes, e o desenvolvedor 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 ou empresa que vive da criao de software sem dvidas no fica contente ao ver-se escrevendo cdigo similar infinitamente, gastando tempo e recursos na programao de rotinas que j foram criadas anteriormente, mas que pela falta de uma metodologia apropriada, no podem ser reutilizadas ou customizadas para suprirem necessidades especficas de cada cenrio. Resumindo, as principais vantages 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 as vantagens 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:

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

29/08/10

Programao Orientada a Objetos em .NET Parte 1

Page 2 of 12

Abstrao Encapsulamento Herana Polimorfismo A incapacidade de uma linguagem em suportar qualquer um destes conceitos a desqualifica como uma linguagem orientada a objetos. Sendo estes os alicerces da POO, vamos dissecar cada um deles a seguir. Inicio da pagina

Abstrao
Abstrao pode ser definida como a capacidade de representar cenrios complexos usando termos simples. Pode-se tomar um exemplo da vida real para ilustrar o conceito: um carro uma abstrao de um veculo 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 a partida no motor, pisarei na embreagem, engatarei a primeira marcha, acelerarei, controlarei a direo em que o carro ir se mover utilizando o volante. Tamanha explicao no se faz necessria pois todo o conceito daquilo foi abstrado para algo que conhecemos como carro. Apesar de um carro ser algo bastante complexo, basta dizer vou usar o meu carro para ir ao trabalho amanh, e qualquer pessoa entender o recado. Da mesma forma, imagine a confuso para qualquer pessoa entender a seguinte frase: Quando abro aquele 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 j trazem algo escrito, e outras aparecem completamente vazias. Seria muito mais fcil substituir toda esta explicao apenas dizendo O programa tem uma tela com diversos TextBox. Mais uma vez, o complexo 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. O mesmo ocorre com botes de comando, caixas de seleo, grupos de opo, etc. Todos eles so objetos complexos abstrados para simples termos que todo desenvolvedor utiliza quando precisa referenciar 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 objetos complexos da vida real, como por exemplo Pedido, Cliente, Produto, e muitos outros. Mas veremos exemplos destes objetos mais adiante. Neste ponto importante compreender a diferena entre classe e objeto. Quando mencionado que algo complexo foi abstrado para algo conhecido como TextBox, este algo uma classe. Uma classe um modelo 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 somente para criar objetos baseados nela, e so os objetos que sero realmente utilizados. Deste modo, no utiliza-se a classe TextBox diretamente, e sim os objetos criados a partir daquele classe (caso membros estticos ou compartilhados venham mente do leitor, no ltimo pargrafo desta seo procuro esclarecer uma confuso que pode surgir com o conceito). A Figura 1 ilustra este conceito. No lado esquerdo da figura v-se um modelo da classe TextBox, listando alguns de seus membros, como as propriedades Text, Location, Size, e alguns mtodos como Focus e Copy. Ao lado direito, v-se um Form que faz uso de objetos baseados na classe TextBox.

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

29/08/10

Programao Orientada a Objetos em .NET Parte 1

Page 3 of 12

Figura 1. Classes e Objetos Por definio, afirma-se que um objeto a instncia de uma classe. Deste modo, na Figura 1 pode-se ver que o Form possui trs instncias da classe TextBox. TextBox um exemplo de classe disponvel nativamente no .NET Framework. Em muitos casos necessrio criar classes que no existem no framework, como por exemplo uma classe Produto. Criar classes algo muito simples tanto em VB.NET como em C#. O cdigo a seguir mostra a sintaxe necessria em ambas as linguagens. // Em C#: public class Produto { } Em VB.NET: Public Class Produto End Class Neste ponto estou omitindo propositalmente a criao de membros para as classes, como propriedades ou mtodos, apenas para manter a clareza do exemplo. Neste artigo existem sees dedicadas a membros de classes. Instanciar classes (ou criar objetos) tambm bastante simples, como pode-se ver 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 a classe. 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, ento vale 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 de abordar 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 provavelmente desistiriam 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 dispositivo que propulciona o carro j o suficiente. A maior parte dos detalhes do motor est encapsulada dentro do mesmo, e pessoas utilizando o carro no precisam lidar diretamente com o motor.

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

29/08/10

Programao Orientada a Objetos em .NET Parte 1

Page 4 of 12

Alm disso, importante frisar que o motor de um carro tem um funcionamento indepentende das outras partes (tais como direes, pneus, bancos, etc.). Ou seja, mesmo que um carro no tenha as quatro rodas, isto no impede de o motor funcionar, pois ele funciona como uma unidade independente, uma caixa-preta. Tomando agora o exemplo da caixa de texto em uma tela de um programa, pode-se refletir sobre os diversos detalhes que esto encapsulados dentro daquele objeto. Por exemplo, o desenvolvedor no sabe examente (ou no precisa saber) como que o sistema operacional ir desenhar a representao visual daquele objeto na tela, mandando sinais da CPU para a placa de vdeo, e ento para o monitor, e ento criando o objeto na posio que foi especificada previamente. Felizmente o desenvolvedor no precisa se preocupar com este tipo de detalhe. Tudo o que preciso colocar a caixa de texto na tela e configurar as propriedades Top e Left, para determinar onde o controle dever aparecer. A mgica do como o controle ir aparecer na tela algo que o objeto auto-suficiente o bastante para fazer aquilo sozinho. Os conceitos de Abstrao e Encapsulamento andam de mos dadas, visto que com a abstrao definimos a entidade que representa um objeto complexo, e o encapsulamento esconde detalhes daquele objeto, e com isto esconde detalhes de seu funcionamento que poderiam assustar a qualquer pessoa tentando utiliz-lo. Imagine se o motorista tivesse que saber a quantidade exata de combustvel a ser inserida no carburador quando o acelerador do carro acionado? Acho que eu s andaria de nibus, ou de carona. Inicio da pagina

Herana
Herana pode ser definida como a capacidade de uma classe herdar atributos e comportamento de uma outra classe. Basta um passeio ao redor da cidade para descobrir-se que existem vrios tipos e modelos de carros l fora. Carros de passeio, carros de corrida, carros conversveis, carros com volante do lado esquerdo e outros 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. Diversos conceitos abstrados e encapsulados no objeto carro j foram planejados, testados e aprovados, e por isso 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 pode herdar estas caractersticas e funcionamento de um projeto j existente. Caso seja necessrio criar um novo carro que seja quase igual a todos os outros, mas que possua algumas coisas diferentes (por exemplo, utilizando um cmbio automtico ao invs de manual), o projetista pode herdar o novo carro a partir do projeto bsico, e ento adicionar as caractersticas especficas do novo carro ao novo projeto. Voltando ao exemplo da caixa de texto: a classe-base da caixa de texto retangular e geralmente tem um fundo branco e os caracteres mostrados em preto. Isto suficiente para diversos cenrios, mas imaginando-se o cenrio onde faz-se necessria a incluso de uma caixa de texto que dever receber somente a entrada de nmeros (proibindo a digitao de letras), e dever mostrar o nmero em azul caso seja positivo e vermelho caso seja negativo, logo percebe-se a necessidade em se criar uma nova classe. Esta nova classe ser bastante semelhante caixa de texto padro. De fato, semelhante o suficiente 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 conceitos so 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 digitado this.ForeColor = Color.Red; }

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

29/08/10

Programao Orientada a Objetos em .NET Parte 1

Page 5 of 12

else { try { // Tenta-se converter a string em um valor decimal decimal 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 usurio if (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 classe System.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 e a formatao diferenciada para valores positivos e negativos. Com esta nova classe criada, o prximo passo apenas utiliz-la. O cdigo a seguir mostra trechos de cdigo 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 as instncias 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 especializada ValorTextBox 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 classe especializada em ao, enquanto que o terceiro um TextBox bsico. O importante ponto a frisar na utilizao da herana que a classe criada uma vez, e ento utilizada em quantos Forms forem necessrios. Supondo que em algum momento seja necessrio alterar a aparncia e/ou comportamento de todos os TextBox que utilizam esta classe, basta alterar diretamente na classe e todos os objetos refletiro a alterao. Por exemplo, ao invs de mostrar os nmeros negativos em cor vermelha, agora o usurio deseja ver os nmeros em letras amarelas, e a cor-de-fundo do TextBox deve passar a ser vermelha.

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

29/08/10

Programao Orientada a Objetos em .NET Parte 1

Page 6 of 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 chamada superclasse, 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-se dizer que o homem -um ser-humano, ou que um calhambeque -um carro, assim como nossa nova caixa 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 compreenso ser gradualmente facilitada. A Figura 3 mostra uma representao grfica destes termos. A seta preta que conecta a classe Homem (SubClasse) classe Humano (SuperClasse) indica que Homem -um Humano. A verde indica que a classe Homem uma especializao da classe Humano, e a seta azul indica 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. No mundo da programao, polimorfismo muitas vezes definido como a capacidade de objetos diferentes possuirem mtodos de mesmo nome e mesma lista de parmetros que quando chamados executam tarefas de maneiras diferentes. Estas definies em nada ajudam ao desenvolvedor que est tentando desmistificar o paradigma da poo_ E sinceramente no conheo nenhuma forma para se explicar polimorfismo usando poucas palavras, por isso sempre procuro usar bastante analogias e exemplos diversos para ilustrar a explanao.

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

29/08/10

Programao Orientada a Objetos em .NET Parte 1

Page 7 of 12

Seguindo com o exemplo do carro, pode-se dizer que carro -um veculo. Pode-se tambm dizer que moto -um veculo, e o mesmo vale para bicicleta. Todo veculo possui algum meio para acelerar, no importa qual mecanismo usado para isso, e o mecanismo geralmente diferente, principalmente se comparado um carro (que usa um motor) uma bicicleta (que usa pedais, corrente e coroa). Colocado em outras palavras, temos objetos diferentes (carro, moto, bicicleta), que derivam de uma mesma classe (veculo). Esta classe possui um mtodo Acelerar, e deste modo, podemos utilizar os diferentes objetos de modo polimrfico, invocando um mtodo de mesmo nome, mas que possui implementao e comportamento diferente em cada um dos objetos. Um tpico exemplo utilizado na explicao de polimorfismo a criao de formas geomtricas, ou qualquer outro objeto que crie algum tipo de desenho na tela. Considere uma classe base chamada Forma, a qual representa qualquer forma que dever ser desenhada na tela. Esta classe mostrado no seguinte 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 possuem implementao sufience para oferecer funcionalidades concretas a serem utilizadas. Neste exemplo, a classe Forma tem o mtodo Desenhar. Este mtodo recebe um objeto do tipo Graphics, o qual ser a superfcie onde a forma ser desenhada. No h muito que colocar dentro deste mtodo pois cada forma exige cdigo diferente para ser desenhada. nas classes derivadas da classe Forma que este mtodo 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 ser instanciada diretamente, visto que esta classe oferece algum tipo de funcionalidade concreta. O mtodo Desenhar sobrescrito, tendo o cdigo necessrio para desenhar um crculo perfeito na superfcie passada por parmetro ao mtodo. Note que o mtodo na superclasse chamado explicitamente (em C# usa-se base.NomeDoMtodo, enquanto que em VB usa-se MyBase.NomeDoMtodo) . De modo similar, 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 pelo fato de que ambos fazem uso de mtodos capazes de desenharem elipses e retngulos. Para tornar o exemplo um pouco mais interessante, o seguinte cdigo mostra a classe Pessoa, a qual ter a funcionalidade de desenhar uma pessoa. public class Pessoa : Forma { public string Falar(string frase) { return "Pessoa falando " + frase; }

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

29/08/10

Programao Orientada a Objetos em .NET Parte 1

Page 8 of 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 para desenhar a representao de uma pessoa na superfcie passada ao mtodo. Caso o leitor no esteja familiarizado com GDI+ (que vem sendo utilizado para criar os desenhos neste exemplo), no se preocupe: neste momento, o ponto importante salientar que o mtodo Desenhar de cada classe concreta pode ser bastante diferente entre as classes, ou seja, a implementao pode ser completamente diferente entre as diversas classes. Na classe Pessoa tambm est definido um mtodo Falar. Isto foi feito apenas para enfatizar o fato de que as subclasses da classe Forma podem ter diferentes membros (mtodos, propriedades, etc.), alm daqueles herdados da superclasse. Para a visualizao deste exemplo, foi criado um Form bastante simples, definido com o cdigo mostrado na Listagem 2 (partes irrelevantes do cdigo foram omitidas para 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. /// </summary> /// <param name="forma">Forma que ser desenhada e visualizado no Form.</param> public Visualizador(Forma forma) { InitializeComponent(); // Persiste o objeto passado durante a existncia do Form this.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 (chamado ExemploPolimorfismo), o qual apenas contm um boto chamado btnExecutar, o qual ir instanciar as diversas Formas e utilizar o Visualizador para mostrar o resultado do mtodo Desenhar de cada uma delas. O cdigo executado quando o boto Executar deste Form clicado, bem como o mtodo-auxiliar Mostrar 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();

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

29/08/10

Programao Orientada a Objetos em .NET Parte 1

Page 9 of 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 passadas para 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 bastante simples. Um campo privado do tipo Forma declarado na classe com o intuito de manter uma referncia genrica para qualquer tipo de forma passada para ser visualizada. Um construtor especializado definido para receber referncia para a forma que se deseja visualizar, e persistir esta referncia 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 necessrio declarar 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 do tipo 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 tipos diferentes de objetos (circulos, quadrados, pessoas, etc.) podem ser passados como parmetro para este mtodo pois todos estes objetos derivam da classe Forma. Ento, vlido chamar este mtodo passando um crculo, pois crculo -uma forma, e Forma o tipo que o mtodo est esperando receber. 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 Pessoa compartilham algo em comum: todas elas derivam da superclasse Forma, a qual define o mtodo Desenhar, que neste exemplo, vem sendo usado de maneira polimrfica. Entretanto, existem cenrios onde diferentes objetos precisam ser usados de maneira polimrfica, mas infelizmente eles no so derivados da mesma superclasse. Suponha que uma nova classe Funcionario seja adicionada a este exemplo. Esta uma classe de negcios, e portanto, herda de uma superclasse Negocios (em um cenrio real, uma classe deste tipo abstrai 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. At ento, 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();

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

29/08/10

Programao Orientada a Objetos em .NET Parte 1

Page 10 of 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 as formas circulo, quadrado e pessoa anteriormente. Por ser uma classe de negcios, a classe Funcionario no pode herdar de qualquer outra classe seno a classe Negocios. Isto significa que a classe Funcionario no possui um mtodo Desenhar, e portanto no compartilha nada em comum com as classes que sabem como desenhar a si mesmas. Como este caso pode ser resolvido? Antes de se precipitar e responder basta adicionar um mtodo Desenhar classe Funcionario, devo mencionar que isto no far com que a classe passe a compartilhar algo em comum com as classes circulo e quadrado, pois ela continua no herdando da mesma 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 seu prprio mtodo Desenhar sendo chamado diretamente, contudo no ser possvel utilizar classe genrica Visualizador, pois lembre-se, aquela classe espera por um objeto que seja-uma Forma, o que 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 muito diferente 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 entre objetos que no seria possvel caso os objetos no herdassem da mesma superclasse. Ao utilizar uma interface, 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. convencionado nomear classes comeando com um I masculo (indicando interface), e seguindo com uma ou mais palavras que definam qual a capacidade garantida por aquela interface. Neste caso, objetos que implementam esta interface podem ser interpretados como classes desenhveis (este padro usado no .NET Framework, como nas interfaces IDisposable, IComparable, IEnumerable, etc.). Veja no cdigo a 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 de uma interface sero sempre pblicos pois uma interface como um contrato, e toda classe implementando esta interface deve saber exatamente quais so as clusulas (membros) deste contrato para que possa satisfazer a todos os detalhes. O prximo passo alterar as classes Funcionario e Forma, de modo que estas classes implementem a interface IDesenhavel. O cdigo seguinte mostra em negrito as principais alteraes (partes irrelevantes com relao interface foram omitidos pra manter a clareza do exemplo). public class Funcionario : Negocios, IDesenhavel { #region Membros da Interface IDesenhavel public void Desenhar(Graphics g) { // Carrega a foto em um objeto Image. Image im = Image.FromHbitmap(this.Foto.GetHbitmap());

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

29/08/10

Programao Orientada a Objetos em .NET Parte 1

Page 11 of 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 a interface IDesenhavel. Em .NET, herana-mltipla no suportada, portanto cada classe pode herdar de apenas uma superclasse, mas no entanto pode implementar qualquer nmero de interfaces. Visto que a interface IDesenhavel possui o mtodo Desenhar, a classe Funcionario passa automaticamente a ser obrigada a implementar tal mtodo (naquele mtodo est o cdigo necessrio para utilizar o bitmap que possui a foto do funcionrio e desenhar aquela imagem na superfcie). Caso deixe de implementar o 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 interface IDesenhavel, e como j existia um mtodo Desenhar em conformidade com aquele definido na interface, 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 de quais interfaces so implementadas tambm herdada para as subclasses. Outra importante alterao a mudana do tipo utilizado no Visualizador e no Form ExemploPolimorfismo. Basicamente, ao invs de fazer referncias a objetos do tipo Forma, passa-se a referenciar a objetos que implementam IDesenhavel. A Listagem 3 mostra em negrito as alteraes em ambos 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 Form this.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();

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

29/08/10

Programao Orientada a Objetos em .NET Parte 1

Page 12 of 12

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

Figura 5. Polimorfismo em ao Refrescando a mente: usando o conceito de polimorfismo podemos ter objetos diferentes que possuam algum 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 a operao. 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 tudo em .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 quatro principais alicerces da POO so: Abstrao, Encapsulamento, Herana e Polimorfismo, sobre os quais vimos 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 (classala@eps-software.com) Desenvolvedor Senior da EPS Software Corp., em Houston, TX. palestrante freqente em grupos de usurios, seminrios e conferncias na Amrica do Norte e Brasil. MVP C#.NET, MCSD for .NET, e colunista na MSDN Brasil. Criou e apresentou vrios treinamentos em vdeo para o Universal Thread, e tem artigos publicados em diversas revistas internacionais. 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

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

29/08/10

Anda mungkin juga menyukai