VB .NET - Classes e estruturas (partial,public, private, protected, friend, shadows)


"Recordar é viver" , diz um ditado popular.

Vamos então recordar alguns conceitos básicos sobre classes e estruturas visto que são recursos muito usados no dia a dia de qualquer desenvolvedor que trabalha com uma linguagem orientada a objetos.

Classes

Classes são pacotes de dados e comportamento relacionado que podem conter atributos, métodos e eventos.

Para criar uma classe no VB .NET você selecione o menu Project (Projeto) - Add Class (Adicionar Classe) ;

Na janela Add New Item (Adicionar novo Item) selecione o template Class (Classe) e informe o nome do arquivo da classe, no caso do VB .NET a extensão será sempre .vb.

Não confunda este arquivo com a classe , este é nome do arquivo no qual você vai criar a classe ou as classes. O nome da classe ou das classes , sim pois um arquivo pode conter mais de uma classe, você informará no interior do arquivo .vb da classe.

Observe que no arquivo Class1.vb abaixo é criado por padrão a classe Class1. No nosso exemplo criamos além da classe padrão Class1 as classes Aluno, Livro e Leitor no mesmo arquivo Class1.vb conforme abaixo:

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: a cláusula Class name que identifica uma classe e lhe dá um nome e a declaração End Class que indica o fim da classe. A classe pode ser declarada vazia sem métodos, propriedades ou eventos e mesmo assim continuará válida.

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

Class name
......
End Class

Vamos agora as explicações...

Atributo (ou lista de atributos)

O atributo ou a lista de atributos é opcional e refere-se a uma lista de atributos separados por vírgula que se aplica a classe. Uma atributo refina a definição da classe dando mais informações ao compilador.

Atributos podem ser colocados na maioria das declarações, embora um atributo específico possa restringir os tipos de declarações no qual ele é válido. Sintaticamente, um atributo é especificado, colocando o nome do atributo, delimitados por <>, na frente da declaração da classe.

< Serializable() > _
Class Employee
   Public Nome As String

End Class

Partial

A palavra-chave Partial informa ao VB que a declara atual define somente parte de uma classe.

No código abaixo temos a definição de uma classe Aluno que foi feita em duas partes usando a palavra-chave Partial:

Duas Partial Classes serão compilados em uma única classe
Sem o modificador Partial ocorre um conflito pois as classes possuem o mesmo nome e a mesma assinatura

O programa pode conter qualquer número de pedaços da classe Aluno. No momento da compilação o Visual Basic encontra os pedaços da classe e os combina para definir a classe. Se o modificador Partial for removido o VB .NET irá acusar o erro pois não podem existir duas classes com o mesmo nome e a mesma assinatura.

Um dos benefícios desta técnica é separar partes da classe para tornar mais fácil o seu entendimento.

Veremos agora os modificadores de acesso...

Os valores da declaração de acessibilidade de uma classe podem ser os seguintes: Public , Protected , Friend , Protected Friend ,  ou Private .

Public

É o modificador de acesso mais abrangente de todos. Classes e membros de classes marcados com o modificador de acesso Public estão disponíveis na mesma classe, em todas as classes a partir do mesmo projeto e em todos outros projetos também. Pense bem nisso quando você precisar expor somente algumas funcionalidades da sua classe restringir o acesso as suas classes é um bom hábito de programação.

Abaixo temos um exemplo de uso do modificador Public:

A classe Livro usa o modificador Public e portanto esta disponível a qualquer classe do projeto.

Na classe Leitor o método Teste() mostra isso criando uma instância de Livro. Observe que a
declaração : Dim x as new Livro() indica que temos acesso a classe Livro.

Private

O modificador Private é aplicável somente a membros de um tipo e restringe o acesso aos membros do próprio tipo.

 

Aqui o membro strTitulo esta declarado como Private no interior da classe Livro. Dessa forma ele não pode ser acessado fora da classe Livro.

Lembre-se que o modificador de acesso Private só pode ser aplicado a membros de um tipo e não ao próprio tipo. Isto significa que você não pode declarar uma classe como Private mas se a sua classe estiver aninhada então ela pode ser declarada como Private:

No exemplo abaixo temos a classe Livro declarada como Private. Observe que o VB .NET indica o erro informando que tipo declarado como Private devem estar dentro de outro tipo e sugere alterações:

No código acima temos a classe Pagina declarada como Private; observe que ela esta dentro da classe Livro e portanto pode ser declarada como Private.

Protected

O modificador Private permite que você esconda membros de sua classe de outras classes, mas e se alguém quiser herdar a sua classe e você deseja que os membros da classe seja herdados ?  Neste caso você quer que membros da classe base estejam disponíveis na classe derivada e o modificador Private não vai permitir que isso ocorra.

Para estes casos existe o modificador Protected, os membros marcados com o modificador Protected podem ser acessados na mesma classe e em todas as classes que herdam da classe.

No exemplo abaixo temos na classe Classe1 o membro idade declarado como Protected;

A classe Classe2 herda da Classe1 e tem acesso ao membro idade sem problemas;

A classe Classe3 não herda de Classe1 e tenta acessar o membro idade através da instância da classe Classe1 mas não consegue e o VB .NET indica o erro: Classe1.idade não esta acessível neste contexto porque idade é Protected.

Você somente pode usar a palavra chave Protected para modificar o acesso de uma classe se a classe que você esta declarando esta contida no interior de outra classe:

Como a classe AlunoEndereco esta declarada como Protected , ela é visível somente no interior da classe Aluno.

Se outra classe herdar de Aluno também poderá acessar o membro Endereco.

Se você tentar declarar uma classe como Protected irá obter um erro: indicando que tipos protegidos só podem ser declarados em uma classe com sugestão para corrigir o erro:

Friend

Vamos assumir que você quer que todas as classes do seu projeto sejam capazes de acessar os membros da sua classe mas que classes externas ao seu projeto não tenham este direito.

Neste cenário nem o modificador Private nem o Protected podem lhe ajudar. Para esta situação temos o modificador Friend.

O modificador de acesso Friend é usado para declarar que os membros de sua classe estejam acessíveis a somente todas as classes do seu projeto, ou seja , classes externas não terão acesso aos membros declarados com esse modificador.

Abaixo temos o membro idade declarado como Friend na classe Aluno. A classe Escola esta no mesmo projeto da classe Aluno e acessa o membro através de uma instância da classe Aluno sem problemas.

Incluímos então um novo projeto do tipo Class Library com o nome ClassLibrary1 no VB .NET e incluímos uma referência(Add Reference) ao projeto anterior. A seguir declaramos a classe Escola conforme o código a seguir:

Observe que mesmo tendo conseguido criar uma instância da classe Aluno que esta no projeto VB_Classes, não temos acesso ao membro idade sendo que o VB .NET indica o erro com a mensagem: idade não esta acessível neste contexto porque é Friend.

Se declararmos a classe Aluno do projeto VB_Classes como Friend perderemos o acesso a classe no outro projeto conforme mostrado a seguir:

Classe declarada no projeto VB_Classes
Classe declarada no projeto ClassLibrary1

O modificador Friend é o modificador padrão para qualquer classe que não possua um modificador declarado.

Shadows

O modificador Shadows significa que quando um membro de uma classe derivada possuir o mesmo nome que um membro do mesmo tipo em uma classe Pai , o membro na classe derivada substitui inteiramente todas as variações do método da classe Pai deixando a classe derivada com somente uma versão do método : aquele que foi definida na classe derivada.

Shadows também indica que o  nome de um membro da classe Pai ou classe Base pode ser reutilizado na classe herdada mesmo que por outro tipo de membro. Assim você pode usar o nome de uma propriedade definida na classe Pai como um método na classe Filha. O método definido com o modificador Shadows vai 'encobrir'  o método da classe Pai.

Neste exemplo temos uma classe Pai e uma ClasseFilha que herda da ClassePai e neste caso o método expoente definido na classe Filha com o modificador Shadows irá substituir os métodos definidos na classe Pai. Haverá apenas um único método expoente: o definido na classe Filha.

Estruturas

Estruturas são muito parecidas com classes. Abaixo temos uma resumo da sintaxe da declaração de uma estrutura:

[ attribute_list ] [Partial] [ accessibility ] [Shadows] _
Structure nome [(Of type_list )]
      [Implements interface ]
          statements
End Structure

A única coisa que todas as declarações de estrutura precisam incluir é a cláusula Structure / End Structure.

Diferente das classes porém, uma estrutura não pode estar vazia ela precisa conter ao menos uma declaração de variável ou evento.

Structure StructureVazia
     Private Idade As Integer
End Structure

No código acima temos uma estrutura válida apenas uma declaração.

Outra diferença é que uma estrutura não suporta herança e portanto não pode usar as palavras chaves: MustInherit , NotInheritable , ou
Inherits.

1 - A palavra chave Inherits permite criar a herança no VB.NET.
2 - O modificador MustInherit faz com que uma classe seja destinada apenas a servir como base para criação de outras classes. Elas não podem ser  instanciadas. (Conhecida como classe abstrata)

3 - A única forma de usar uma classe com o modificador MustInherit é criar classes filhas que herdem suas propriedades e métodos
4 - Todas as classes declaradas podem ser herdadas. Para impedir que uma classe seja hereditária (ou herdada) use em sua declaração o modificador NotInheritable

Apesar disso uma estrutura pode implementar qualquer número de interfaces e assim usar a herança de interface.

A principal diferença entre uma estrutura e uma classe fica evidenciada em como cada uma efetua a alocação de memória para os seus dados.

Assim classes são tipos de referências e dessa forma uma instância de uma classe é na verdade uma referência para um objeto armazenado na memória. Quando você cria uma instância de uma classe o VB na verdade cria uma referência que aponta para a alocação atual de memória do objeto.

Já as estruturas são tipos de valores e uma instância de uma estrutura contém os dados no interior da estrutura ao invés de um apontamento para eles. Abaixo temos um esquema representando esta diferença na alocação de espaço em memória:

A diferença na memória requerida pelas classes e estruturas é pequena quando você considera somente um objeto simples. Se você examinar um array a diferença já aumenta.

Dessa forma em um array de objetos contém referências para dados em outra parte da memória e quando você declara um array pela primeira vez as referências terão o valor Nothing, então elas não apontam para nenhum dado e nenhuma memória é alocada para os dados, como as referências ocupam 4 bytes o objeto array declarado terá somente 4 bytes por entrada.

Uma instância de estrutura de arrays por outro lado aloca espaço para os dados no array ,e , se cada objeto da estrutura tomar 1000 bytes da memória então o array contendo N itens usará 1000 * N bytes de memória.  Sentiu o drama ???

Bom, creio que já deu para você refrescar a sua memória com alguns conceitos relacionados com classes e estruturas. Faltou falar sobre construtores, sobrecarga, sobrescrita, etc.. Fique a vontade para pesquisar e aprender mais.

Eu sei é apenas VB .NET , mas eu gosto...

Referências:

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

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti