Desenvolvimento - Visual Basic .NET

POO – Programação Orientada a Objetos em VB.NET – Parte 1

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

por David Pomarico



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.

Classes

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

Objeto à 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:

  • Abstraçã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 ao 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 abstraçã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 ([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:

Nas propriedades não podem passar-se argumentos ByRef.

Uma propriedade só poderá ser definida como propriedade de uma classe se tiver parâmetros.

É possível colocar o código que se entender quer no Get quer no Set. No entanto o que está no exemplo anterior é obrigatório, i.e. o retorno no Get e a actualização da variável no Set são imperativos.

As propriedades devem ter nomes sugestivos

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 Nome
End Function
Public Overloads Function RetornaPessoa(ByVal Nome As String, ByVal Sobrenome As String) As Integer
        Return Nome & " " & Sobrenome
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 Nome
    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 Nome
    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.

David Pomarico

David Pomarico - Analista de Sistemas, MCP (Micrososft Certified Professional) em ASP.NET e WindowsForms, atualmente trabalhando em uma multinacional, graduado em Tecnologia em Desenvolvimento de Softwares na Faculdade Informática e Administração Paulista (FIAP), 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, Pocket PC, VB.NET, C#, 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