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 PomaricoO 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.
- Entity Framework 4: Repositório GenéricoVisual Basic .NET
- As edições 14 da Easy .net Magazine e 88 da .net Magazine já estão disponíveis.ADO.NET
- Postando no Twiiter com .NET e Migre.meC#
- Setup ApplicationsVisual Basic .NET
- Problemas na manipulação de arquivos do MS Excel com .NETVisual Basic .NET