Sie sind auf Seite 1von 16

AULA 1 - DESENVOLVIMENTO DE SOFTWARE

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:
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.

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.
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;
}
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.

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.
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;
}

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();
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();
}

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());

// 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();
}
}
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

Conceitos : Sobrecarga (Overloading)

Sobrecarga ou Overloading o que isso ?
Se voc esta vindo de uma linguagem procedural como Clipper,
Dbase , Basic ou se esta comeando agora tendo o VB como sua
primeira linguagem de programao pode estranhar o termo.
Mas apenas uma questo de prtica.
Sobrecarga a habilidade de poder definir diversas
propriedades , mtodos ou procedimentos em uma classe com o
mesmo nome.
Voc entendeu ?
Bem, vou ser mais claro.
Se voc criar dois procedimentos em seu aplicativo com o
mesmo nome e com argumentos diferentes estar usando
sobrecarga.
Voc deve estar se perguntando: "Como posso criar dois
procedimentos com o mesmo nome ? Como vou diferenci-los ?
".
Garoto ' experto' voc !!!
Voc vai diferenciar os procedimentos pela lista de argumentos
que eles vo possuir , isto , os procedimentos tero
argumentos diferentes. Vou dar um exemplo :
Suponha que voc precise criar uma classe com um mtodo que
retorne o valor da rea de um quadrado , s que este mtodo
vai poder aceitar como parmetro uma string ou um nmero.
Veja a soluo genrica :
Function Calcula_Area(ByVal lado
As Double) As Double

Return lado * lado

End Function
Function Calcula_Area(ByVal lado
As String) As Double
Dim ld as Double
ld = CDbl(lado)

Return ld * ld

End Function
Voc tem duas funes com o mesmo nome mas que possuem
argumentos diferentes e que fornecem o mesmo resultado.
Para usar a sobrecarga no VB.NET todos os membros
sobrecarregados devem ser declarados com a palavra-chave
: Overloads.
Veja como ficaria no VB.NET :
Overloads Function
Calcula_Area(ByVal lado As Double)
As Double

Return lado * lado

End Function
Overloads Function
Calcula_Area(ByVal lado As String)
As Double

Dim ld As Double
ld = CDbl(lado)

Return ld * ld

End Function
Podemos criar mais mtodos com argumentos diferentes.
Suponha que voc tenha que calcular a rea de um tringulo
tambm.
Como voc deve saber das aulas de matemtica do colgio (que
voc amava ) a rea de um tringulo : (base x altura)/2 ,
logo voc vai precisar de mais um argumento: a altura.
Veja como fica o mtodo sobrecarregado:
Overloads Function Calcula_Area(ByVal Base As Double, ByVal Altura
As Double) As Double

Return (Base * Altura) / 2

End Function
Este conceito muito usado para definir mltiplos construtores
para um objeto. Mas isto assunto para um outro artigo:
Construtores.
Ento at l...


Classe - http://www.macoratti.net/09/10/vbn_cb1.htm
Orientao a objetos - http://www.macoratti.net/vbn_coo1.htm

Das könnte Ihnen auch gefallen