| Por David Carlos Pomarico dcpomarico@uol.com.br Analista de Sistemas, atualmente trabalhando em uma multinacional, graduado em Tecnologia em Desenvolvimento de Softwares na Faculdade Informática e Administração Paulista (FIAP), palestrante acadêmico Microsoft em plataforma .NET, Co-Líder do Grupo de Usuários Codificando.Net SP ( www.codificando.net ), experiência de 2 anos em .NET, conhecimentos e práticas em Framework .NET, ASP.NET, WinForms, VB.NET, C#.NET, Crystal Reports.NET, Active Reports for .NET, MS SQL 2000, Oracle 9i, UML, XML. Visite o meu The spoke: http://br.thespoke.net/MyBlog/dpomarico/MyBlog.aspx |
|
|
|
|
| POO - Programação Orientada a Objetos - Parte 1 | |
|
|
|
O conceito
O termo orientação a objetos significa organizar o mundo real como uma coleção de objetos que incorporam estrutura de dados e um conjunto de operações que manipulam estes dados.
Em programação uma Classe representa uma entidade e como tal define o seu
comportamento (Métodos) e as suas características (Propriedades).
Aos acontecimentos que podem ocorrer para uma dada entidade em determinada
altura, chama-se Eventos.
Ex:
Entidade (Classe): Pessoa
Características (Propriedades): Altura, peso, etc
Comportamento (Métodos): Andar, Correr, Comer, etc
Eventos: AoAcordar, AoDeitar, etc
Comparação entre Classes e Objetos
Uma Classe consiste na definição de uma entidade, (com as suas
propriedades, métodos e eventos) enquanto um objeto representa um "exemplar" de
uma entidade.
Ex: Classe à Pessoa
Objecto à João
Requisitos numa linguagem
OOP
Além do conceito de classes e objetos, existem vários outros conceitos que
devem ser observados numa linguagem de programação, para que esta possa ser
considerada OOP:
-
Abstracção
-
Encapsulamento
-
Herança
-
Interfaces
-
Polimorfismo
Abstração
Este é um dos conceitos básicos quando se fala de OOP. Antes de definir uma
classe é importante consumir algum tempo e pensar como fazê-la.
Por exemplo, quando se vai à caixa Eletrônico existem várias opções à
disposição. Se quiser sacar dinheiro basta escolher a opção "Saque", e embora
"por trás" isso desencadeie vários processos, estes não são visíveis para quem
usa o caixa.
O que se ganha com isto? Uma Classe é definida uma vez, mas é susceptível de ser utilizada N vezes por nós ou por terceiros. Com a abstração vem uma maior facilidade de utilização da classe, diminuição da probabilidade de enganos, aumento de rapidez do desenvolvimento e melhoria da legibilidade do código.
Encapsulamento
É o processo pelo qual se escondem os detalhes de implementação nas Classes. Ou seja consiste na aplicação do conceito de abstracção descrito atrás.
Herança
Trata-se de um conceito muito mencionado no meio da programação e consiste
no estabelecimento de uma relação entre duas classes, na seguinte perspectiva:
"A Classe Y é do género da Classe X". Por exemplo um Cliente é uma pessoa e um
empregado também.
A ideia da herança é permitir que neste tipo de situações se possa definir
uma classe Base a partir da qual derivam outras classes. Cada Classe
derivada possui (ou pode possuir) tudo o que está definido na sua classe Base
e depois ser-lhe-ão acrescentadas mais coisas conforme for necessário.
O ponto forte da herança é a reutilização!!
Interfaces
Os interfaces servem para definir apenas as assinaturas dos métodos,
propriedades ou eventos a implementar nas classes.
Isto permite separar a definição de uma classe da sua implementação.
Exemplo:
Interface Mensagem
Sub
MensagemCompleta(ByVal Titulo As String, ByVal corpo As String)
Sub
Mensagem(ByVal corpo As
String)
End Interface
Public Class Classe1
Implements Mensagem
Public Overloads Sub Mensagem(ByVal corpo
As String) Implements Mensagem.Mensagem
MessageBox.Show(corpo)
End Sub
Public Sub MensagemCompleta(ByVal
Titulo As String, ByVal
corpo As String) Implements Mensagem.MensagemCompleta
MessageBox.Show(corpo,
Titulo, MessageBoxButtons.OK, MessageBoxIcon.Information,
MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly)
End Sub
End Class
Public Class Classe2
Implements Mensagem
Public Sub Mensagem(ByVal
corpo As String)
Implements Mensagem.Mensagem
MessageBox.Show(corpo, "",
MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1,
MessageBoxOptions.DefaultDesktopOnly)
End Sub
Public Sub MensagemCompleta(ByVal
Titulo As String,
ByVal corpo As String) Implements
Mensagem.MensagemCompleta
MessageBox.Show(corpo, Titulo,
MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1,
MessageBoxOptions.DefaultDesktopOnly)
End Sub
End Class
Pode notar-se que as duas classes tem os mesmos métodos, porém cada um com um comportamento diferente.
Polimorfismo
As vezes a mesma operação se comporta de modo diferente quando aplicada a
objetos baseados em classes diferentes. Por exemplo imagine o método Caminhar.
O objetivo é o mesmo ou seja deslocar-se do ponto A para o ponto B, mas um
adulto caminha de uma maneira e um bebê de outra...
O polimorfismo vem permitir que estas situações possam ser implementadas.
Construtores
Um construtor é um método que permite criar um objeto à custa de uma
determinada classe. E é o objeto que ocupa recursos em memória e é utilizado em
Run-time.
Em VB .NET o construtor de uma classe apresenta-se na forma de um Sub
com um nome específico: New.
Assim quando se faz:
Dim frm As New Form1()
Isto indica que ao declarar uma variável frm ela será uma instância do tipo Form. E isto acontece com a invocação do New que consiste num Sub (definido na classe Form neste caso) dentro do qual deve constar todas as instruções necessárias para a inicialização do objeto.
Overloading do Construtor
É possível fazer overloading do Sub New tal como se faz para os outros, porém Não pode usar a palavra-chave Overloads junto a nenhum construtor. De resto as regras são as mesmas.
Access Modifiers
Private: Membros private em uma classe são visíveis apenas no escopo da classe. (variáveis locais)
Públic: Membros declarados como public são visíveis em todo o aplicativo, porém não são acessados em herença, somente por instância do objeto. (são variáveis globais)
Protected: Um membro Protected só pode ser acessado por classes derivadas ou pelos métodos da classe.
Shared: indica que um determinado membro da classe é compartilhado e pode ser acessado por todas as instâncias da classe. Não necessita de instância da classe para chamar o método. (também conhecidos como membros estáticos)
Friend: Torna um membro da classe visível por todo o projeto , mas não a um controlador de uma instância do objeto.
Métodos
Quando um procedimento ou função é declarado no âmbito de uma classe é
considerado um método dessa classe.
Propriedades
Uma propriedade é um membro que representa uma característica de uma classe
(ou estrutura). Por default, a propriedade é alvo de leituras e escritas, ou
seja o programador pode averiguar o seu conteúdo e alterá-lo. No entanto é
possível criar propriedades só de leitura ou só de escrita.
Em VB .NET existe uma sintaxe específica para a declaração de propriedades:
[Access Modifier] [Default | ReadOnly |
WriteOnly] Property <Nome da propriedade> ([Lista de
parâmetros]) As [Tipo de dados retornado pela propriedade]
Get
[Bloco de código processado
aquando da leitura da propriedade]
End
Get
Set
(valor As [Tipo de Dados da propriedade])
[Bloco de código processado
aquando da escrita na propriedade]
End
Set
End
Property
Exemplo:
Private sngAltura As Single
Public Property Altura()
As Single
Get
Return sngAltura
End Get
Set(ByVal Value As Single)
sngAltura = Value
End Set
End Property
Nota:
Inherits
Esta palavra chave deve ser utilizada na classe
derivada (filha), logo na linha abaixo da sua definição. À frente dela
coloca-se o nome da classe base (mãe). A partir desse momento tudo o que não
tenha sido declarado como Private na mãe está disponível na filha!
É portanto através desta palavra chave que se
cria a relação de "parentesco" entre as várias classes.
Atenção: Em VB .NET é implementada herança simples, ou
seja cada classe pode apenas derivar de uma outra classe e não mais.
MustInherit e NotInheritable
O MustInherit faz com que sua classe sirva apenas como base para a criação de outras classes (classe abstrata). O NotInheritable significa que outras classes não poderão herdá-la.
Palavras-Chaves
Overloads: Utilizado para métodos com o mesmo nome,
porém com comportamentos diferentes. Exemplo:
Public Overloads Function RetornaPessoa(ByVal
Nome As String)
As String
Return
End Function
Public Overloads Function RetornaPessoa(ByVal
Nome As String,
ByVal Sobrenome As String) As Integer
Return
End Function
Overridable: Significa que o método da classe filha poderá
sobrepor o método da classe Pai.
Overrides: Significa que a classe filha está
implementando o método da classe pai. No exemplo abaixo repare que cada uma das
funções, apesar de ter a mesma assinatura, tem comportamento diferente.
Public Class Pai
Public Overridable Function RetornaNome(ByVal
Nome As String)
As String
Return
End Function
End Class
Public Class Filha
Inherits Pai
Public Overrides Function RetornaNome(ByVal Nome As String) As String
Return "Seu nome
é: " & Nome
End Function
End Class
NotOverridable: Significa que o método não poderá ser
sobreposto.
MustOverride: Significa a obrigatoriedade de implementar o
método da classe pai na classe filha.
Shadows: Se o membro da classe filha tiver o mesmo nome do membro da classe pai, o método da classe filha irá sobrepor inteiramente o método da classe pai em todas as variações.
Exemplo:
Public Class Pai
Public Function RetornaNome(ByVal
Nome As String)
As String
Return
End Function
End Class
Public Class Filha
Inherits Pai
Public Shadows Function RetornaNome(ByVal Nome As String, ByVal Sobrenome
As String) As String
Return "Seu nome
completo é: " & Nome & " " & Sobrenome
End Function
End Class
Dicas
- Crie os
métodos de uma classe sempre de acordo com a sua necessidade. Utilize Public,
Private, Shared, Friend, Function, Sub com coerência.
- Lembre-se de que um objeto é uma instância
de uma classe. Imagine a planta de uma casa e uma casa. A planta seria a classe
e a casa é a classe instanciada.
- Não crie variáveis públicas dentro de sua
classe. Crie propriedades que irão acessá-las. Se você criar variáveis públicas
você estará fugindo do conceito de encapsulamento.
- O VB.NET não cria um construtor visível na
classe. O que ele faz é criar esse construtor em runtime automaticamente, por isso, toda a classe que você criar,
adicione a linha:
Public Sub New()
End Sub
- Utilize as palavras-chaves MustInherit e NotInheritable SEMPRE.