O que é Polimorfismo?
É um conceito de programação orientada a objetos que permite definir diferentes versões de objetos que compartilham algumas das mesmas características. Na linguagem, um exemplo seriam dois carros diferentes. Um Lamborghini é um carro, assim como um Ford KA. Ambos têm as características comuns de todos os carros, mas não são o mesmo carro e têm carrocerias e motores diferentes, mas essas carrocerias e motores realizam tarefas semelhantes, como mudança de marcha, cores diferentes e partida.
Em termos de VBA você pode criar um objeto Class que define quais características e métodos cada tipo de objeto irá compartilhar. Num exemplo de programação mais prático, digamos, uma classe FormAuditor desenvolvida para enviar mensagens para algum lugar. Talvez seja para uma tabela de banco de dados ou talvez para um arquivo de log, ou talvez até mesmo mostrando a lista de alterações em um controle de formulário.
Portanto, cada um desses diferentes métodos de escrita poderia ser um objeto separado, mas não sabemos qual deles o usuário desejará usar. Para fornecer todas as três opções de forma intercambiável, poderíamos criar uma classe simples de esqueleto AuditorOutput como esta:
EXEMPLO ORIGINAL:
'AuditorOutput Class
Option Compare Database
Option Compare Explicit
Public Sub WriteAuditorOutput(activeFormAuditor As FormAuditor)
End Sub
'AuditorOutput Class
Option Compare Database
Option Explicit ' Obrigatório declarar explicitamente todas as variáveis
SCRIPT APRIMORADO PARA IMPLEMENTAR:
Public Sub WriteAuditorOutput(activeFormAuditor As FormAuditor)
' Esta sub-rotina recebe um objeto FormAuditor como parâmetro e escreve a saída do auditor
' Declarando variáveis
Dim xlApp As Object
Dim xlBook As Object
Dim ws As Object
Dim db As Database
Dim strSQL As String
Dim strPath As String
' Verifica se foi fornecido um objeto válido FormAuditor
If Not IsNull(activeFormAuditor) Then
' Define o caminho para o arquivo Excel
strPath = "C:\Caminho\Para\Seu\Arquivo\Excel.xlsx"
' Configura a aplicação Excel
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True ' Torna a aplicação Excel visível
' Cria um novo livro (workbook) no Excel
Set xlBook = xlApp.Workbooks.Add
' Obtém uma referência ao banco de dados do Access
Set db = CurrentDb
' Executa uma consulta SQL para recuperar dados do formulário do Access
strSQL = "SELECT * FROM " & activeFormAuditor.RecordSource
Set ws = xlBook.Sheets(1) ' Obtém a referência à primeira planilha do Excel
' Copia os dados do formulário do Access para a planilha do Excel
With ws
.Cells(1, 1).CopyFromRecordset activeFormAuditor.Recordset ' Copia os dados começando da célula A1
End With
' Salva o livro do Excel no caminho especificado
xlBook.SaveAs strPath
' Fecha objetos do Excel
xlBook.Close
xlApp.Quit
' Libera referências de objetos
Set ws = Nothing
Set db = Nothing
Set xlBook = Nothing
Set xlApp = Nothing
Else
MsgBox "O objeto FormAuditor fornecido é inválido.", vbExclamation, "Erro"
End If
End Sub
Agora, para utilizar esta classe como uma interface de objeto (a definição dos elementos públicos da série de objetos), faríamos algo assim para a classe AO_ToDatabase e a classe AO_ToFile:
EXEMPLO ORIGINAL:
'AO_ToDatabase Class
Option Compare Database
Option Compare Explicit
Implements AuditorOutput
Private Sub AuditorOutput_WriteAuditorOutput(activeFormAuditor As FormAuditor)
' Add Code here to loop over FormAuditor information and save to a database
End Sub
SCRIPT APRIMORADO PARA IMPLEMENTAR:
'AO_ToDatabase Class
Option Compare Database
Option Explicit ' Obrigatório declarar explicitamente todas as variáveis
Implements AuditorOutput ' Implementa a interface AuditorOutput
Private Sub AuditorOutput_WriteAuditorOutput(activeFormAuditor As FormAuditor)
' Este método é chamado para escrever a saída do auditor para um banco de dados
' Adicione aqui o código para iterar sobre as informações do FormAuditor e salvar no banco de dados
' Por exemplo:
' Declarando variáveis
Dim db As Database
Dim strSQL As String
' Verifica se o objeto FormAuditor fornecido é válido
If Not IsNull(activeFormAuditor) Then
' Obtém uma referência ao banco de dados do Access
Set db = CurrentDb
' Constrói a consulta SQL para inserir os dados do FormAuditor no banco de dados
strSQL = "INSERT INTO NomeDaTabela (Campo1, Campo2, Campo3) VALUES ('" & activeFormAuditor.Campo1 & "', '" & activeFormAuditor.Campo2 & "', '" & activeFormAuditor.Campo3 & "')"
' Executa a consulta SQL
db.Execute strSQL
' Libera a referência ao objeto Database
Set db = Nothing
Else
MsgBox "O objeto FormAuditor fornecido é inválido.", vbExclamation, "Erro"
End If
End Sub
E neste caso a classe AO_ToFile seria estruturada da mesma forma, mas com código para salvar as informações em um arquivo:
EXEMPLO ORIGINAL:
'AO_ToFile Class
Option Compare Database
Option Compare Explicit
Implements AuditorOutput
Private Sub AuditorOutput_WriteAuditorOutput(activeFormAuditor As FormAuditor)
' Add Code here to loop over FormAuditor information and save to a file
End Sub
SCRIPT APRIMORADO PARA IMPLEMENTAR:
'AO_ToFile Class
Option Compare Database
Option Explicit ' Obrigatório declarar explicitamente todas as variáveis
Implements AuditorOutput ' Implementa a interface AuditorOutput
Private Sub AuditorOutput_WriteAuditorOutput(activeFormAuditor As FormAuditor)
' Este método é chamado para escrever a saída do auditor para um arquivo
' Adicione aqui o código para iterar sobre as informações do FormAuditor e salvar em um arquivo
' Por exemplo:
' Declarando variáveis
Dim fs As Object
Dim f As Object
Dim filePath As String
Dim i As Integer
' Verifica se o objeto FormAuditor fornecido é válido
If Not IsNull(activeFormAuditor) Then
' Define o caminho do arquivo
filePath = "C:\Caminho\Para\Seu\Arquivo\output.txt"
' Cria um objeto FileSystem para manipular arquivos
Set fs = CreateObject("Scripting.FileSystemObject")
' Cria ou abre o arquivo para escrita
Set f = fs.OpenTextFile(filePath, 8, True)
' Escreve as informações do FormAuditor no arquivo
With activeFormAuditor
For i = 0 To .Recordset.Fields.Count - 1
' Escreve cada campo do FormAuditor no arquivo
f.WriteLine .Recordset.Fields(i).Name & ": " & .Recordset.Fields(i).Value
Next i
End With
' Fecha o arquivo
f.Close
' Libera a referência ao objeto FileSystem
Set fs = Nothing
Else
MsgBox "O objeto FormAuditor fornecido é inválido.", vbExclamation, "Erro"
End If
End Sub
Agora, no código onde você deseja configurar um FormAuditor e gerar saída para um ou ambos, o código ficaria assim:
EXEMPLO ORIGINAL:
'Code to use the classes via polymorphism
Dim LogToSomething As AuditorOutput
'Let's say we have a global variable called FormAuditorInstance that has
'collected information on a form and is a FormAuditor object
Set LogToSomething = New AO_ToDatabase
LogToSomething.WriteAuditorOutput FormAuditorInstance
SCRIPT APRIMORADO PARA IMPLEMENTAR:
' Código para usar as classes via polimorfismo
Dim LogToSomething As AuditorOutput ' Declaração de variável do tipo AuditorOutput
' Suponha que temos uma variável global chamada FormAuditorInstance que coletou informações em um formulário e é um objeto FormAuditor
Set LogToSomething = New AO_ToDatabase ' Instancia um objeto do tipo AO_ToDatabase e atribui à variável LogToSomething
LogToSomething.WriteAuditorOutput FormAuditorInstance ' Chama o método WriteAuditorOutput do objeto LogToSomething, passando FormAuditorInstance como parâmetro
E se você quisesse usar uma implementação diferente de AuditorOutput, você poderia simplesmente especificar a linha Set para usar esse objeto:
Set LogToSomething = New AO_ToFile
Clique aqui e nos contate via What's App para avaliarmos seus projetos