VB .NET - Programação Orientada a Objetos (em 10 lições práticas) - I


VB .NET é uma linguagem orientada a objetos.

Este artigo inicia um curso básico que mostra algumas das características da programação orientada a objetos (POO) presentes na linguagem Visual Basic .NET em 10 lições rápidas e práticas.

Ao estudar os conceitos abordados neste artigo os iniciantes terão uma visão dos principais conceitos da orientação a objetos e sua utilização na linguagem VB .NET.

Vamos ao trabalho...

Lição 1 - Namespaces, Classes e Objetos e Módulos

No VB.NET, classes e outras estruturas de dados para um propósito específico são agrupados para formar um namespace.

Você pode usar as classes em um namespace, simplesmente importando o namespace.

A palavra-chave Imports é usada para importar um namespace para o seu projeto. O .NET Framework. fornece um rico conjunto classes agrupadas em vários namespaces. Nesta lição, estamos usando o namespace System.

Importe o namespace System (já disponível em. NET).


   Imports System    

Uma classe é uma definição de um objeto real.

Por exemplo Humano é uma classe que representa todos os seres humanos. Cachorro é uma classe que representa todos os cachorros.

Em uma definição mais técnica podemos dizer que : Classes são pacotes de dados e comportamentos relacionados que podem conter atributos, métodos e eventos.

No VB .NET podemos resumir a sintaxe usada na declaração de uma classe da seguinte forma:

[ atributo ] [Partial] [ accessibility ] [Shadows] [ inheritance ] _
Class name [(Of type_list )]
       [Inherits classe_pai ]
       [Implements interface ]
       statements
End Class

Vejamos as principais declarações usadas.

Para começar podemos dizer que de todas as declarações usadas acima as únicas que são obrigatórias para todas as classes são:

Com base nisso uma classe obrigatoriamente teria que usar no mínimo a seguinte sintaxe ao ser declarada :

Class name
......
End Class

Uma classe pode possuir membros como : campos ,  propriedades , métodos: sub-rotinas e funções.

Nota: O VB .NET fornece funções e sub-rotinas. As Funções sempre retornam um valor e uma sub-rotinas não pode retornar um valor.

Assim podemos ter:

  1. Um namespace Animais;
  2. A classe Cachorro no namespace Animais;
  3. A sub-rotina (método) Latir() na classe Cachorro;

Um objeto é uma instância de uma classe.

Uma classe é um modelo de uma entidade que a classe representa. Para usar um campo, método ou qualquer outro membro de uma classe você vai precisar tornar a classe em um objeto.

Na linguagem OOP um objeto é uma instância de uma classe; assim para criar um objeto temos que instanciar o objeto a partir de  uma  classe. (A classe é um conceito, o que existem são os objetos)

No VB .NET podemos criar uma instância de uma classe de duas formas:

Dim objetoCachorro As New Animais.Cachorro       Dim objetoCachorro As Animais.Cachorro   
   objetoCachorro = New Animais.Cachorro

1- forma direta

2- forma indireta

Os módulos da linguagem Visual Basic .NET fornecem uma maneira simples de testar pequenos trechos de códigos. Em aplicações de produção os módulos são menos usados do que as classes mas não deixam de ter sua utilidade para ilustrar conceitos importantes. Como as classes e os formulários, os módulos são definidos em arquivos fontes que possuem a extensão .vb.

Você usa um módulo para criar um container para variáveis, procedimentos e funções usadas em toda a aplicação , e, em alguns casos, para fornecer o método que funciona como um ponto de entrada para a aplicação.

Sintaticamente falando, um bloco de módulo esta delimitado pelas palavras chaves Module e End Module e podem conter constantes públicas ou privadas, campos, propriedades e métodos.

Você pode usar módulos para escrever funções comuns. Um módulo é um grupo de funções.

Ao contrário das funções nas classes, as funções públicas em módulos podem ser chamadas diretamente a partir de qualquer outro lugar do projeto.

O método Main é o ponto de entrada pra todas as aplicações do tipo console e opcionalmente para as aplicações do tipo Windows forms.

Na sua forma mais simples o método Main é um procedimento do tipo Sub que não usa argumentos.

Lição 2 - Tipos de Acessos

Ao escrever suas classes você pode ou não querer que outras pessoas acessem sua funcionalidade acessando suas propriedades e chamando seus métodos. 

Na OOP podemos restringir o acesso a um membro de uma classe e ter assim mais controle sobre o conteúdo da classe. 

Você é quem decide se vai permitir que outras pessoas acessem os métodos e propriedades da sua classe ou se o acesso somente poderá ser feito a partir da sua própria classe.

O VB.NET oferece os seguintes níveis de acesso :

Quando colocamos os dados e métodos (sub-rotinas e funções) em uma classe temos o que é conhecido como Encapsulamento.

Normalmente, em uma classe, as variáveis utilizadas para armazenar dados (como a idade de um cão) são declaradas como Private.

Funções ou propriedades são usadas para acessar essas variáveis. Proteger os dados de um objeto do acesso a funções fora da classe é chamado de abstração ou ocultamento de dados.

Isso impede a modificação acidental ou mal intencionada de dados por funções externas.

Para poder ter acesso ao campo idade podemos definir a propriedade Publica IdadeCachorro na classe Cachorro que permite acessar e atribuir valor a variável idade:

 Public Property IdadeCachorro() As Integer
          Get
                Return idade
          End Get
          Set(ByVal Value As Integer)
                idade = Value
          End Set
 End Property

Para definir uma propriedade somente leitura removemos os comandos Set/End Set

 Public Property IdadeCachorro() As Integer
          Get
                Return idade
          End Get
 End Property

Nota: A partir o VS 2010 podemos usar no VB .NET as propriedades auto-implementadas.

Lição 3 - Funções estáticas (Shared)

De forma geral para poder ter acesso as propriedades e métodos da classe temos que criar uma instância da classe.

Os membros compartilhados ou shared de uma classe (funções e variáveis) podem ser usados sem ter que criar objetos da classe.

O modificador Shared indica que o método não funciona em uma instância específica de um tipo e pode ser chamado diretamente a partir de um tipo e não através de uma instância específica de um tipo.

Com isto concluímos que membros declarados como Shared são membros da classe e não membros de instância e podemos acessar membros declarados como Shared em uma classe sem criar uma instância da classe.

Nota: O equivalente na linguagem C# seria a palavra chave static.

O método Comer() e a variável tamanho foram declaradas como Shared e poderão ser acessados diretamente sem termos que criar uma instância da classe, conforme mostramos no exemplo abaixo:

O .NET Framework possui muitas classes Shared; como exemplo podemos citar a classe System.Math.

Lição 4 - Sobrecarga (Overloading)

Sobrecarga ou Overloading o que é isso ?

Se você esta vindo de uma linguagem procedural como Clipper, Dbase , Basic ou se esta começando agora tendo o VB como sua primeira linguagem de programação pode estranhar o termo. Mas é apenas uma questão de prática.

Sobrecarga é a habilidade de poder definir diversas propriedades , métodos ou procedimentos em uma classe com o mesmo nome.

Você entendeu ?

Bem , vou ser mais claro. Se você criar dois métodos em seu aplicativo com o mesmo nome e com argumentos diferentes estará usando sobrecarga.

Você deve estar se perguntando: "Como posso criar dois métodos com o mesmo nome ? Como vou diferenciá-los ? ". Garoto 'experto' você !!!

Você vai diferenciar os procedimentos pela lista de argumentos que eles vão possuir, isto é, os métodos terão argumentos diferentes. Vou dar um exemplo :

Suponha que você precise criar uma classe com um método que retorne o valor da área de um quadrado , só que este método vai poder aceitar como parâmetro uma string ou um número:

Temos dois métodos Calcula_Area() que usam argumentos com tipos diferentes: Double e String. Neste caso os métodos são ditos sobrecarregados.

Podemos também usar a palavra-chave Overloads ao criar métodos sobrecarregados. (Ela é opcional,mas se você usar em um método terá que usar nos demais)

Public Function Calcula_Area(ByVal l As Double) As Double
Public Function Calcula_Area(ByVal lado As Double) As Double

Public Overloads Function GetNomeCompleto(ByVal nome As String)
Public Overloads Function GetNomeCompleto(ByVal nome As String, Optional ByVal sobrenome As String = "")

Public Overloads Function GetNomeCompleto(ByVal nome As String) As String
Public Overloads Function GetNomeCompleto(ByVal nome As String) As Boolean

Lição 5 - Herança

Herança é um conceito chave usado na programação orientada a objetos para descrever uma relação entre as classes;

Por meio da herança uma classe copia ou herda todas as propriedades, atributos e métodos de uma outra classe, podendo assim estender sua funcionalidade;

A classe que cede os membros para a outra classe é chamada superclasse, classe pai ou classe base;

A classe que herda os membros da outra classe é chamada subclasse ou classe derivada;

A herança permite a reutilização de código e especifica um relacionamento de especialização/generalização do tipo "é um";

Embora seja recurso poderoso a herança deve ser usada somente quando necessário pois pode levar a um acoplamento forte entre as classes do seu projeto dificultando a sua reusabilidade e a manutenção;

Existe a herança de implementação onde uma classe derivada herda da classe base e a herança de interface onde uma classe pode herda de uma interface, neste caso apenas as assinaturas dos métodos são herdados sendo que os métodos devem ser implementados;

No VB.NET usamos a declaração inherits para implementar a herança. O VB.NET não suporta herança múltipla, assim uma classe derivada pode ter uma única classe base.

Public Class A

    Public a As Integer

    Public Sub New()
        Console.WriteLine("construtor A")
    End Sub

    Public Sub M(nome As String)
        Console.WriteLine("sou o " & nome)
    End Sub

End Class
Public Class B
        Inherits A

    Private b As Integer

    Public Sub New()
        Console.WriteLine("construtor B")
    End Sub

    Public Sub J()
        Console.WriteLine("sou J ")
    End Sub
End Class
Classe A - classe Base (Pai) Classe B (Filha) que herda da classe A

O modificador de acesso protected torna a variável de uma classe base somente acessível as suas classes derivadas; (outras classes não acessam a variável)

Métodos herdados de System.Object :
Equals – Testa se dois objetos são iguais
GetHashCode – Retorna o código de hash para o objeto
GetType – Retorna informação sobre a classe do objeto
ToString – Retorna o objeto como string

Todas as classes declaradas podem ser herdadas. Se você não quer permitir que uma classe seja herdada inclua na declaração da classe a palavra-chave : NotInheritable.

Para impedir que uma classe seja herdada usamos o modificador MustInherit. Este modificador faz com que uma classe seja destinada apenas a servir como base para a criação de outras classes.

Desta forma não é possível criar instâncias diretas desta classe. (Chamamos isto de classe abstrata em C#)

Lição 6 - Sobreposição (Overriding)

Por padrão, uma classe derivada herda os métodos de sua classe base. Se uma propriedade herdada ou método precisa se comportar de forma diferente na classe derivada ele pode ser substituído, ou seja, você pode definir uma nova implementação do método na classe derivada.

No VB.NET indicamos que um método é passível de sobreposição usando a palavra-chave Overridable na classe pai (classe base) e a seguir na classe filha declaramos novamente o método com a palavra-chave Overrides. Assim temos que :

Public Class Pessoa

    Public Overridable Sub profissao()
        Console.Write("Eu sou um engenheiro.")
    End Sub

End Class
Class Funcionario : Inherits Pessoa

    Public Overrides Sub profissao()
        Console.Write("Eu sou funcionário do governo.")
    End Sub

End Class
Classe Pai
Classe Filha

Para que um método da classe pai não possa ser sobreposto usamos o modificador - NotOverridable.

Já, para definir que um método seja obrigatoriamente sobreposto em uma classe filha usamos a palavra-chave - MustOverride.

Na próxima aula irei abordar os conceitos da programação orientada a objetos como polimorfismo, construtores, destrutores e propriedades.

Referências:


José Carlos Macoratti