VB.NET - Usando métodos e membros shared (estáticos)


Você sabe o que são e como usar membros ou métodos Shared (estáticos) ?

As propriedades e métodos de uma classe podem ser membros de instância da classe ou membros compartilhados(shared) ou estáticos.

Membros de instância são associados com instâncias de um tipo , enquanto que membros estáticos (shared) são associados com a classe e não com uma instância em particular.

Métodos são métodos de instância a menos que você explicitamente os defina como métodos estáticos (shared) usando a palavra-chave Shared.

A grande maioria dos métodos são métodos de instância , isto significa que você deve acessá-los a partir de um objeto especifico. Quando você precisar de um método de classe , ou seja , um método que seja acessado diretamente da classe você deve definí-lo como estático ou Shared.

Você pode acessar um membro shared através do nome da classe na qual ele foi declarado. Vamos supor que você têm uma classe chamada Botao e tenha também objetos instanciados desta classe chamado btnAtualiza e btnDeleta. Se a classe Botao tiver um método Desenhar() e um método shared GetBotaoCount(). O trabalho de Desenhar() é desenhar o botao atual, e o trabalho de GetBotaoCount() é retornar o numero de botões atualmente visíveis no formulário.

Você pode acessar um método de instância através de uma instância da classe , ou seja , através de um objeto:

btnAtualiza.Metodo()

Você também pode acessar um método shared da mesma forma:

btnAtualiza.GetBotaoCount()

Você pode também acessar um método shared através do nome classe assim :

Botao.GetBotaoCount()

Isto permite que você acesse o método shared sem ter criado uma instância da classe.

Um uso comum de variáveis membros shared ,  é gerenciar o número de instâncias/objetos que atualmente existem para uma classe. No exemplo a seguir vamos criar a classe Cachorro. Esta classe poderá ser usada em uma loja de animais de estimação.

A classe cachorro pode ser criada em um projeto do tipo console selecionando a opção Add Class Module:

Option Strict On
Imports System

Class Cachorro

Private Shared instancias As Integer = 0
Private peso As Integer
Private nome As String

Public Sub New(ByVal name As String, ByVal peso As Integer)

instancias += 1

Me.nome = nome
Me.peso = peso

End Sub

Public Shared Sub quantosCachorros( )
    Console.WriteLine("{0} cachorros instanciados", instancias)
End Sub

Public Sub informaPeso( )
    Console.WriteLine("{0} is {1} Kg", nome, peso)
End Sub

End Class
A classe Cachorro possui:

as seguintes variáveis membros:

  • instancias - private Shared
  • peso - private
  • nome - private

um construtor

  • que atribui um nome e um peso às variáveis membros

os seguintes métodos :

  • quantosCachorros() - imprime quantos cachorros foram instanciados
  • informaPeso() - informe o peso do cachorro

Para usar a classe vamos criar um módulo no mesmo projeto anterior:

Exemplo de utilização da classe Cachorro e seus métodos e propriedades:

Module Module1
Sub Main( )
Cachorro.quantosCachorros( )
Dim bilu As New Cachorro("Bilu", 5)
bilu.informaPeso( )
Cachorro.quantosCachorros( )
Dim nero As New Cachorro("nero", 7)
nero.informaPeso( )                ' método de instância
nero.quantosCachorros( )        ' método shared através da instância
Cachorro.quantosCachorros( )  ' método shared através da classe
End Sub
End Module

 

A classe Cachorro é iniciada pela definição da variável membro shared instancia, que é iniciada com valor zero. Este campo membro shared irá gerenciar o número de objetos Cachorros que serão criados.

Cada vez que o construtor (Sub New) for executado (criando um novo objeto) o campo instancias será incrementado de uma unidade.

Nota: Um método é invocado sempre que uma instância de um objeto é criada. Este método é chamado construtor. Cada vez que você define uma classe você é livre para definir o seu próprio construtor , mas se você não o fizer , o compilador irá fornecer um para você de forma transparente e automática. O serviço do construtor é criar um objeto especificado pela classe e colocá-lo em um estado válido. Antes do construtor rodar , o objeto é uma referencia na memória, depois que o construtor é executado e finalizado , a memória trata com uma instância válida da classe.(Qualquer construtor que não toma argumentos é chamado construtor padrão. )

A classe Cachorro também define dois campos de instância: nome e peso que tratam do nome e do peso de cada objeto Cachorro.

A classe Cachorro também define dois métodos :

- quantosChachorros() - é um método shared ; o numero de Cachorros não é um atributo de qualquer Cachorro , mas um atributo da classe.

- informaPeso() - é um método de instância ; o nome e o peso de cada cachorro é obtido por instância, i.e, cada cachorro tem seu próprio nome e peso.

O Método Main() acessa o método shared quantosCachorros diretamente , através da classe :

Cachorro.QuantosCachorros( )    ' método shared através da classe

O método Main() cria uma instância de Cachorros e acessa o método de instância informaPeso() através de uma instância de Cachorro.(Ex: bilu)

Dim bilu as New Cachorro("Bilu",10)
bilu.informaPeso()

cada vez que um novo cachorro for criado, o método é incrementado de uma unidade.

Você acessa a instância do método através do objeto , mas você pode acessar o método shared ou através de um objeto ou através da classe conforme podemos ver no código escrito a seguir:

nero.informaPeso( )                 ' método de instância
nero.quantosCachorros( )        
' método shared através da instância
Cachorro.QuantosCachorros( ) 
 ' método shared através da classe

Você pode pensar em um membro de instância como uma variável global que todo o programa pode enxergar. Lembre-se também que qualquer alteração feita no conteúdo de um variável de instância irá se propagar por todo o programa.

Até mais ver ...


José Carlos Macoratti

1