VB .NET - Classes Abstratas


Ninguém pode reclamar que no site não existem artigos sobre os fundamentos da programação orientada a objetos.  Veja a seguir a lista de artigos sobre o assunto:

Já seria o suficiente , certo ? 

Errado , como eu gosto do assunto e creio que nem sempre se consegue expor todas as nuances do tema em um artigo vou voltar ao assunto para tratar em particular do tema classes abstratas.

O que são classes abstratas

Geralmente quando criamos uma classe o fazemos para um determinado propósito e não pensamos previamente que a classe poderá ser herdada por outra classe. Agir desta forma é seguir o caminho natural das coisas: criamos uma classe e a usamos e pronto.

Ocorre que existem ocasiões nas quais criamos uma classe que devemos usar mas já percebemos que no futuro outras classes poderão herdar da classe que estamos criando. Neste caso já temos a herança em mente.

Imagine que ao criar uma classe você perceba que ao invés dela servir a um único propósito ela possa ser generalizada e usada para outros objetivos.

Imagine que você esta criando uma classe que você pretende usar para efetuar cálculos com retângulos, quadrados, paralelogramos e triângulos:

  h - altura

  l - lado

  b - base

A primeira coisa que lhe vêm a cabeça e que a tal classe poderia servir para ser usada com diferentes tipos de figuras geométricas.

Logo ao invés de criar uma classe para cada tipo de figura geométrica você poderia criar uma classe generalizada na qual todas as figuras pudessem se basear.

Se você analisar com mais detalhe vai notar que as figuras geométricas que você pretende tratar em sua classe generalizada não tem muita coisa em comum; pois enquanto o triângulo e o paralelogramo possuem uma base o retângulo e o quadrado não possuem. Além disto nem o perímetro nem a área destas figuras são calculadas da mesma forma.

Vejamos então o que elas têm em comum. Todas possuem um nome e uma descrição. (nada animador...)

Podemos então criar uma classe que apenas defina as características que não sejam comuns de forma a deixar a implementação de cada uma delas para cada objeto que seria responsável por customizar as características de acordo com sua própria particularidade.

A nossa classe genérica será  destinada apenas a servir como base para a criação de outras classes, nela deveremos apenas declarar os métodos que não são comuns de forma a que sejam definidos por cada objeto particular da classe que herdar da nossa classe genérica.

Esta é a base para o conceito de abstração em orientação a objetos e a classe genérica que serve de base para outras classes é chamada de classe abstrata.

No VB.NET uma classe é definida como abstrata através do uso do modificador MustInherit. Então para criar uma classe abstrata do VB.NET você precisa preceder a palavra chave Class com o modificador MustInherit .

Inicie o VB 2005 e crie um projeto do tipo Windows Application chamado classesAbstratas. A seguir no menu Project selecione a opção Add Class e dê o nome de Quadrilatero.

Como exemplo vamos definir uma classe Quadrilatero como abstrata:

Public MustInherit Class Quadrilatero

End Class

Após criar a classe definindo-a como abstrata podemos incluir um ou mais membros na classe. Vamos incluir um método chamado Descricao() na classe:

Public MustInherit Class Quadrilatero

       Public Function Descricao() As String
              Return "Forma Geométrica"
       End Function

End Class

A utilização do modificador MustInherit indica que a classe esta destinada apenas a servir como base para a criação de outras classes , ou seja , não é possível criar instâncias direta desta classe. Se você tentar vai obter uma mensagem de erro conforme abaixo:

Uma classe declarada com o modificador MustInherit é também conhecida como classe abstrata ( Em Java usamos o modificador abstract )

Utilizando classes abstratas você pode declarar classes que definam apenas parte de uma implementação, deixando que as classes estendidas forneçam a implementação específica de alguns ou de todos os métodos. É o que vamos fazer neste exemplo...

Como uma classe abstrata esta destinada apenas a servir como base para a criação de outras classes, quando criamos métodos e/ou propriedades na classe abstrata podemos desejar que eles sejam sobrepostos ou não. Se desejamos que um método seja sobreposto na classe que vai herdar da classe abstrata devemos prepará-los para serem sobrescritos. Fazemos isso usando o modificador MustOverride.

Quando você usa o modificador MustOverride você esta sinalizando de que vai precisar de uma classe herdada para sobrepor a propriedade ou método.

Na nossa classe abstrata Quadrilatero já temos um método que não necessita ser obrigatoriamente sobreposto. Vamos então incluir uma propriedade que deverá ser sobreposto na classe estendida.

Public MustInherit Class Quadrilatero

       Public Function Descricao() As String
              Return "Forma Geométrica"
       End Function

       Public MustOverride ReadOnly Property Area() as Double

End Class

Depois de criar a classe abstrata usando o modificador MustInherit , podemos herdar novas classes a partir dela usando a palavra chave Inherits:

Public Class Quadrado
                Inherits Quadrilatero

End Class

Ao herdar a partir de uma classe abstrata , a primeira coisa que você deve se ater é que cada membro da classe abstrata que possuir a palavra chamada MustOverride deverá ser sobreposto. Vamos fazer isto com a nossa classe acima:

Podemos também , se desejarmos ou se houver necessidade, incluir novos membros na classe derivada:

A classe Quadrado o método Area() usando o modificador Overrides

Ele  permite que você sobreponha o método definido na classe base.

Você é obrigado a definir a propriedade Area() na classe Quadrado pois ele foi definido como MustOverride na classe abstrata Quadrilatero.

Overrides - possibilita que você sobreponha uma propriedade ou método na classe base.

MustInherit - Faz com que a classe seja destinada apenas a servir como base para criar outras classes, não permitindo a criação de instâncias diretas da classe.

Sub New() - Permite a criação de uma rotina dentro da classe para implementar um construtor.(Um construtor controla a inicialização do objeto)

Na classe Quadrado temos:

Dois construtores (Sub New), um sem argumentos e outro recebendo um parâmetro do tipo Double;

A propriedade Lado que retorna o lado e que define o lado com validação.

A propriedade Area que retorna o valor da  área do quadrado.

Após efetuar estas definições podemos usar a classe abstrata e a classe derivada conforme o exemplo a seguir:

No formulário padrão do projeto form1.vb inclua um listbox e um button:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


Dim quad As New Quadrilatero.Quadrado

quad.Lado = 15.45


ListBox1.Items.Add(
" Quadrado ")

ListBox1.Items.Add(quad.Descricao)

ListBox1.Items.Add(" Lado = " & quad.Lado)

ListBox1.Items.Add(" Area = " & quad.Area)


End
Sub

 

O resultado do processamento irá resultar em :

Eu sei, é apenas Visual Basic, mas eu gosto ...

Referências:


José Carlos Macoratti