.NET - Conceitos básicos da Programação Orientada a Objetos ( POO )


Prosseguindo com os conceitos básicos da programação orientada a objetos - POO - vou abordar neste artigo os seguintes tópicos :
  1. Métodos Shared
  2. Nested Class (inner class)
  3. O método Main
  4. Criando uma Singleton class

Se você considerar que estes conceitos são fundamentais para quem esta iniciando com as novas linguagens da plataforma .NET :  VB.NET ou C# ; não vai me achar redundante por estar , às vezes , repetindo temas de artigos anteriores. Vamos ao que interessa.

1- Métodos Shared (Compartilhados/Estáticos)

Como você já deve saber .NET é inteiramente orientada a objetos de forma que todos os dados e informações estão encapsuladas dentro de classes. Desta forma quando um método esta definido no interior de uma classe nós precisamos criar uma instância da classe para poder usar o método. Não há como invocar diretamente o método.

Nota: Em VB . NET é possível criar um módulo e declarar alguns métodos públicos que podem ser chamados diretamente sem a necessidade de criar uma instância.

Existe no entanto uma maneira de usarmos os métodos de uma classe sem a necessidade de criar uma instância da classe que possuí o método : são os métodos Shared.

Os métodos Shared apresentam um mecanismo que tornam o método disponível mesmo se a classe não foi instanciada. Diferente de comportamento de um método padrão , um método Shared compartilha toda a informação e funcionalidade do método com todas as demais instância da classe. Assim , os métodos Shared são utilizados para realizar operações que não estão associadas com qualquer instância de objeto particular.

A classe Math possui diversos métodos Shared ( cos , sin , tan , etc.) e eles podem ser usados sem que a classe seja instanciada. ( Se você conhece Java já percebeu que eu estou falando do método Static)

Para declarar um método Shared (compartilhado) usamos a palavra chave: Shared.

Abaixo um exemplo de uma classe onde temos um método Shared:

Public Class MetodoSharedDemo
         Public Shared Sub metodoShared
                msgbox " Olá , eu sou um método shared "
         End Sub
End Class

Para usar o método podemos usar :    MetodoSharedDemo.metodoShared()

E o resultado será a execução do código em :  msgbox " Olá , eu sou um método shared "

Percebeu que chamamos o método diretamente a partir da classe. Você pode no entanto criar uma instância da classe e a seguir chamar o método Shared que tudo vai funcionar da mesma forma. Veja:

Dim objShared as New MetodoSharedDemo
objShared.metodoShared()

Os métodos Shared podem ser muito valiosos mas devem ser usados com critério pois funcionam como o conceito de uma variável global que expõe o seu conteúdo para todas as instâncias das classe , sendo que qualquer alteração do seu conteúdo se reflete em todas essas instâncias. Além disto você não pode referenciar um membro de instância no interior de um método Shared.

nota: podemos usar a palavra chave Shared para declarar variáveis estáticas.

2- Nested Class ou classes aninhadas

Todas as definições de classe sobre qual abordei em meus artigos até agora eram definidas no escopo de arquivo , ou seja, as classes eram definidas em arquivos , mas não dentro de outras classes. O VB.NET permite o recurso de definir classes dentro de outras classes , o que chamamos de classes aninhadas ou internas (inner class/nested classes).

Você deve estar se perguntando qual seria a utilidade disto. Podemos pensar em alguns cenários onde talvez precisamos definir uma coleção de variáveis ; ou funções e eventos a serem definidos e chamados usando um nome único (o nome da classe).

A seguir um exemplo de utilização de classe interna onde eu estou definindo uma classe Alunos que trata a informação básica : número e nome e uma classe definida dentro da classe Aluno : a classe Notas onde a informação tratada refere-se a pontuação em algumas disciplinas:

Public Class Alunos

   Dim numero_ As Integer

   Dim nome_ As String

   Dim notas_ As New Notas

   Public Sub New(numero As Integer, nome As String, portugues As Integer, matematica As Integer)

        numero_ = numero

        nome_ = nome

        notas_.portugues_ = portugues

        notas_.matematica_ = matematica

         Console.WriteLine("Aluno " & nome & " Portugues : " & portugues & " Matematica : " & matematica)

    End Sub
 

    Public Function getMedia() As Integer

       Return notas_.getTotal / 5

     End Function
 

     Private Class Notas

       Public portugues_ As Integer

       Public matematica_ As Integer


      
Public Function getTotal() As Integer

          Return portugues_ + matematica_

         End Function

   End Class

End Class

 

Testando a classe podemos incluir o código abaixo no método Sub Main() do módulo Module1:

Module Module1
    Sub Main()
        Dim alunos As Alunos = New Alunos(1, "Macoratti", 8, 7)
        Console.WriteLine(" A média das duas notas é : " & alunos.getMedia())
        Console.ReadKey()
    End Sub
End Module

 - A classe Alunos expõe somente o seu construtor e o método getMedia ( ambos são do tipo Public)               
- Todas as outras definições estão encapsuladas na classe
- Na classe Alunos definimos o tipo Notas dentro do qual estou tratando as informações referente a notas de português e matemática.
- Na classe Alunos eu estou usando a classe interna Notas() que é visível somente dentro da classe Alunos.

Este é um exemplo básico de utilização e criação de uma classe interna.

Como não existe uma relação privilegiada entre uma classe aninhada e sua classe "container", se você quiser acessar a classe aninhada na classe de container, você pode usar seus membros estáticos.

Em outras palavras, você pode declarar estático todos os membros da classe aninhada que você deseja acessar na classe de container. Aqui está um exemplo:

Module Module1
    Public Class Container
        Public Class Aninhada
            Public Shared MensagemInterna As String
            Public Sub New()
                MsgBox("=- Classe Interna (Aninhada) -=")
                MensagemInterna = "Construtor da classe aninhada"
            End Sub
            Public Shared Sub Mostrar()
                MsgBox("Estudo de classes Aninhadas (Nested Classes)")
            End Sub
        End Class
        Public Sub New()
            MsgBox("-= Classe Externa (Container) =-")
        End Sub
        Public Sub Exibir()
            MsgBox(Aninhada.MensagemInterna)
            Aninhada.Mostrar()
        End Sub
    End Class
    Public Function Main() As Integer
        Dim container As Container = New Container
        Dim Ins As Container.Aninhada = New Container.Aninhada
        container.Exibir()
        Return 0
    End Function
End Module

3- O método Main()

Tanto Java como C# e VB.NET possuem um método estático (shared) chamado Main() que é responsável pela inicialização de cada aplicação. Assim podemos usar o método Main() para realizar testes em nossa aplicação.

Abaixo um exemplo de utilização do método Main() em C# e VB .NET :

using System

public class Ola
{
   public static void Main()
   {
    console.writeline(" olá , eu sou o metodo Main.);
   }
}

 

Module Module1
 Public Shared Sub Main()
        Console.WriteLine("Olá, Mundo eu sou o método Main()")
 End Sub

End Module

 

C#  VB .NET

Aqui o método Main é declarado void por que não retorna valor algum. O método Main de uma classe se declarado conforme acima é executado na execução da aplicação.

No caso da linguagem VB .NET é mais comum o método Main estar declarado em um Módulo, mas podemos declarar o método Main também uma classe conforme mostra o exemplo abaixo:

Public Class TesteMain

    Public Shared Sub Main()
        Console.WriteLine("Olá, Mundo eu sou o método Main()")
        Console.ReadKey()
    End Sub

End Class

4-  Criando uma classe Singleton

Uma classe Singleton é aquele que permite a criação de somente uma única instância da classe. Se você considerar que uma instância de classe é criada usando o operador New irá verificar que este tipo de classe permite a execução deste operador apenas um vez.

Ter somente uma instância pode ser importante em algumas situações : sistema de arquivos , gerenciador de janelas , gerenciador de impressoras. Veja a seguir um exemplo de classe Singleton:

Imports System
Imports System.Windows.Forms
Imports System.ComponentModel

Public Class SingletonForm : Inherits Form Private

  Shared minhaInstancia As SingletonForm Private

  Sub New()
    Me.Text = "Singleton Formulário " & "[Data de criação : " &  DateTime.Now.ToString() & "]"
    Me.Width = 450
    Me.Height = 150
  End Sub
 
  Protected Overrides Sub OnClosing (ByVal e As CancelEventArgs)
    e.Cancel = True
    Me.Hide()
  End Sub

  Public Shared Function GetInstancia() As SingletonForm
       If minhaInstancia Is Nothing Then
              minhaInstancia = New SingletonForm()
      End If
      Return minhaInstancia
  End Function

End Class
 

Observe que :

- a classe tem somente um construtor do tipo privado
- para obter uma instância da classe temos o método shared GetIstancia e uma variável shared do tipo SingletonForm chamada minhaInstancia
- O método getInstancia retorna a variável minhaInstancia
- O método verifica se minhaInstancia é null e em caso positivo chama o construtor

    If minhaInstancia Is Nothing Then
         minhaInstancia = New SingletonForm()
    End If

- O método retorna  minhaInstancia

Para obter uma referência a única instância da classe singletonForm você não usa o construtor da classe mas chama o método getInstancia conforme o código abaixo:

Dim meuForm As SingletonForm = SingletonForm.GetInstancia()

Assim que você obter a instância você chama os membros da classe como uma classe normal qualquer. Como a classe extende da classe Form (
Inherits Form Private ) podemos usar o método Show conforme o código a seguir

myForm.Show()

Para evitar que a instância da classe seja destruída o método Onclosing , que ocorre quando o formulário é fechado , foi sobreposto:

  Protected Overrides Sub OnClosing(ByVal e As CancelEventArgs)
    e.Cancel = True
    Me.Hide()
  End Sub
Para testar a classe acima siga o roteiro:
  1. Salve o códigoi no arquivo SingletonForm.vb
  2. Abre o prompt de comando.
  3. Altere o diretório para o diretório onde esta o arquivo SingletonForm.vb .
  4. Digite o seguinte comando a seguir e pressione Enter.
vbc /t:library /r:System.dll,System.Windows.Forms.dll SingletonForm.vb

Você irá obter a DLL : SingletonForm.dll

E , até o próximo artigo sobre conceitos OOP .

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti