VB.NET - Primeiros passos - Conceitos - VI

Continuando nossa série de artigos (ou diria curso) sobre VB.NET - Primeiros passos , vou continuar a falar das características da OOP (orientação a objeto ) presentes no VB.NET . OOP significa : OOP - Object Oriented Programming Language ; Neste artigo vou falar sobre sobrecarga , sobreposição , classes abstratas e Interfaces.

Eu já escrevi um artigo abordando o conceito de sobrecarga , veja o link abaixo:

Sobrecarga

Um método pode ser uma rotina ou função , a diferença é que a função irá retornar um valor e a rotina não , mas tanto as rotinas como as funções aceitam argumentos que você passa para o método realizar uma operação. Geralmente você dá um nome característico a uma função ou rotina de forma a poder identificá-la. Ex: calculaSoma , calculaProduto , ...

Existem situações no entanto onde os métodos que precisamos usar fazem operações idênticas mas aceitam argumentos diferentes. Por exemplo : você pode precisar de um método que imprima uma string e precisar que o mesmo método imprima um valor numérico inteiro.

Você poderia criar dois métodos com nomes diferentes : ImprimeString e ImprimeNúmero . Mas na verdade os métodos estão fazendo a mesma coisa : usando o método Print para imprimir o argumento.

O VB.NET, como toda boa linguagem orientada a objetos que se preze, permite que tenhamos múltiplos métodos com o mesmo nome mas com uma lista de argumentos diferentes.

A isto chamamos : Sobrecarga ou Overloading.

Para indicar isto no VB.NET incluímos a palavra-chave Overloads na primeira parte da assinatura do método. (A assinatura é o nome do método).

Nota: O uso da palavra-chave Overloads é opcional e você pode ter métodos com o mesmo nome sem usar Overloads. Veja abaixo um exemplo de sobrecarga.

Imports System

Class Calculadora

 Overloads Public Function Soma(a As Integer, b As Integer) As Integer
   Soma = a + b
 End Function

 Overloads Public Function Soma(a As Double, b As Double) As Double
   Soma = a + b
 End Function

End Class
Module Module1

Public Sub Main()

Dim contador As Calculadora
contador = New Calculator()
 'passando dois argumentos : inteiros
 Console.WriteLine(contador.Soma(1, 5))
 'passando dois argumentos : double
 Console.WriteLine(contador.Soma(1.3, 5.9))

End Sub
End Module
					
A classe calculadora com dois métodos mostrando o conceito da sobrecarga

Usando os métodos sobrecarregados

A sobrecarga de métodos é encontrada por toda a classe .NET Framework. A classe console do namespace System é um exemplo de sobrecarga pois ela possui o método Write que possui 18 assinaturas diferentes : uma aceita um Boolean outra aceita um inteiro , etc...

Mas tome cuidado para não fazer confusão : não pense que um método pode ser considerado sobrecarregado se retornar valores de diferentes tipos.

Dois métodos com o mesmo nome que aceitam a mesma lista de argumentos não irão compilar mesmo que retornem diferentes tipos de dados. Veja o seguinte exemplo:

Imports System
Class Calculadora

Overloads Public Function Soma(a As Integer, b As Double) As Decimal
  Soma = a + b
End Function

Overloads Public Function Soma(a As Integer, b As Double) As Double
  Soma = a + b
End Function

End Class

Ao tentar compilar o código acima iremos ter a seguinte mensagem de erro:

error BC30301: 'Public Overloads Function Add(a As Integer, b As Double) As Decimal' and 'Public Overloads Function Add(a As Integer, b As Double) As Double' differ only by return type. They cannot overload each other.

Quer saber por que ? Ora , se fossemos usar o método com o código abaixo , quais dos dois métodos estamos querendo usar ? Percebeu ???

 Dim contador As Calculadora
  contador = New Calculadora()
  ' passando um inteiro e um Double
 contador.Soma(1, 5.89)

Sobreposição

Já falamos sobre herança no VB.NET e para entender sobrecarga você precisa ter os conceitos sobre herança. Relembre em VB.NET - Primeiros passos - Conceitos - V ) . Quando uma classe herda métodos de outra classe pode ser que seja preciso sobrepor alguns dos métodos herdados , então , se você quiser implementar um método que foi herdado(da classe pai) de maneira diferente na que herdou(classe filha) vai estar usando sobreposição ou overriding.

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 :

Vamos a um exemplo :

Class Pessoa 

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

End Class 
Class Funcionario : Inherits Pessoa

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

End Class
A classe pai usando o modificador Overridable no método profissão  
 A classe filha - Funcionario - herda o método - Profissao. Overrides indica
 que a classe  sobrepõe a classe herdada.
O método profissao na classe - Funcionario - irá sobrepor o método herdado da classe pai.

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.

Classes Abstratas

Pode acontecer que ao escrever um método para uma classe você não saiba como ele vai ser implementado. Neste caso, a implementação será feita pela classe que herdar o método (a classe filha).

Pode acontecer também que você saiba que um determinado método será sobreposto com certeza na classe filha; então por que definir sua implementação se ela não será usada ?.

Nestes casos você apenas define a assinatura do método e deixa a definição por conta da classe irá herdar a classe pai.

Estas classes são então chamadas classes Abstratas e o método que você não implementou é chamado de método abstrato.

Um método abstrato é identificado pelo modificador - MustOverride - , e, a classe que possui este modificador não pode ser instanciada através da palavra chave New. Vamos a um exemplo:

Imports System
MustInherit Class Formas
    Public x As Integer = 9
    Public y As Integer = 0

    MustOverride Sub Desenho()

     Public Function Informacao() As String
          Informacao = "Uma classe abstrata"
     End Function
End Class
O método Desenho não esta implementado , apenas foi declarado , e deverá ser sobreposto na classe que herdar a classe Formas
. Dizemos então que a classe Formas é uma classe Abstrata e o método Desenho é um método abstrato.

Vamos agora criar uma classe que deverá estender a classe abstrata ao fazer isto deveremos fornecer a implementação para todos os métodos que precisam ser sobrepostos.

   Class Circulos: Inherits Formas   

     Overrides Sub Desenho()
      ' Desenha um circulo
     End Sub
   End Class
   Class Linhas: Inherits Formas 

      Overrides Sub Desenho()
       ' Desenha uma linha
      End Sub

   End Class
Tanto a classe Circulos como a classe Linhas herdam da classe Formas e por isto precisam implementar a classe desenho.
Interfaces

Uma interface é parecida com uma classe abstrata; a diferença é que uma classe abstrata pode possuir métodos que não estejam implementados e pode possuir métodos que estejam implementados.

Uma interface somente possui métodos que não possuem implementação.

Uma interface possui somente métodos que não estão implementados e que devem ser implementados pela classe que usar a interface.

Como o VB.NET não suporta herança múltipla as interfaces permitem que uma classe estenda múltiplas interfaces contornando o problema (se é que isto é um problema ). Para implementar uma interface o VB.NET usamos o modificador - Implements .

As interfaces são declaradas usando a palavra-chave - Interface. Geralmente o nome dado a uma interface começa com a letra I. Podemos ter duas sintaxes para o uso com interfaces:


Interface IForma
End Interface

Class Linha
    Implements IForma 
End Class
Interface IForma
End Interface

Class Linha: Implements IForma
End Class
Imports System

  Interface IForma
     Sub Desenho()
  End Interface

  Class Linha
      Implements IForma
      Sub Desenho() Implements IForma.Desenho
         Console.Write("Desenha uma reta")
     End Sub
End Class
Acima temos a interface IForma definida . A classe Linha implementa a interface IForma , por isto define o método Desenho.

A classe Linha pode ser instanciada sem problemas ; já a interface , assim como as classes abstratas não podem ser instanciadas.(Usando o operador New)

Aguarde a continuação do assunto em VB.NET - Juntando as partes - Criando uma aplicação OOP  , onde continuaremos a falar sobre mais conceitos da orientação a objeto presentes no VB.NET através de um exemplo prático onde iremos aplicar os conceitos abordados nos artigos....


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

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C# com exclusivo material de suporte e vídeo aulas com curso básico sobre C#

Veja também os cursos em Vídeo Aulas :

   Gostou ?   Compartilhe no Facebook    Compartilhe no Twitter

Referências:


José Carlos Macoratti