Re-aproveitando eventos no VBA – The Observer Pattern – Eventos em interfaces não dá …

Como se sabe, a linguagem VBA e VB6 é bastante orientada à eventos em sua concepção. Nela, é possível declarar eventos em um módulo de classe e dispará-lo de dentro de um método deste módulo notificando os objetos clientes que algo ocorreu. Essa mesma linguagem tem algumas características das linguagens orientadas a objetos (outro paradigma de programação), porém esse não é o foco deste artigo. Abaixo segue o exemplo de um módulo de classe chamado [Pessoa] que tem como objetivo representar (abstrair) conceitos de uma pessoa:

******************** código da classe (Módulo de Classe) Pessoa que declara dois eventos.

Repare que, em destaque, estão as declarações e lançamentos dos eventos. Para utilizar este módulo de classe em um formulário (seja do MS Access ou do MS Excel ou do VB6) faríamos da seguinte forma:

******************** código do formulário FrmPessoa que utiliza a classe Pessoa

Ao clicar no botão o objeto do tipo pessoa dispara as seguintes notificações:

O problema começa agora …

… imagina se eu quisesse representar outros seres vivos, como cachorros e quisesse re-aproveitar os eventos que eu declarei na classe pessoa.

Eu poderia declarar uma interface com o nome de ISerVivo e implementá-la na classe (módulo de classe) Pessoa e Cachorro conforme segue abaixo:

******************** código da interface ISerVivo

******************** novo código da classe Pessoa, porém, implementando a interface ISerVivo

Neste momento, substituiria o código do formulário para, de maneira mais flexível, poder aceitar outros tipos de seres vivos:

******************** código do formulário FrmPessoa que utiliza a classe Pessoa atribuindo a uma variável do tipo ISerVivo

Veja que agora, no formulário, eu posso aceitar que a variável [serVivo] contenha uma referência para qualquer objeto que implemente a interface ISerVivo, que é o caso de Pessoa, porém, a interface não declara os eventos e o código não compila.

Mesmo se eu declarasse os eventos na interface, não teria um resultado positivo:

******************** código da interface ISerVivo – tentando declarar os eventos

Então, qual a solução para este problema ? Como re-aproveitar os eventos ?

A solução é gerarmos o nosso próprio mecanismo de eventos baseado no Padrão de Projeto Observer Pattern (referências abaixo).

O primeiro passo é declarar duas novas Interfaces ISerVivoEvents e IRegisterClient que representam (a) os eventos que um objeto SerVivo irá disparar e (b) os métodos para que um Observador se registre no objeto a ser Observado.

******************** código da interface ISerVivoEvents

******************** código da interface IRegisterClient

A interface ISerVivoEvents será implementada por todo o Observador que desejar observar as notificações de um determinado objeto. Traduzindo, o formulário FrmPessoa (Observador) deseja observar o que o objeto Pessoa (Observado) o notifica:

******************** código do formulário FrmPessoa preparado para observar as notificações do objeto Pessoa

A interface IRegisterClient é implementada em todo o objeto que deseja ser observado:

******************** código da classe Pessoa implementando a Interface IRegisterClient

Desta forma, o formulário FrmPessoa observará todas as notificações que o objeto Pessoa promover.

******************** código do formulário FrmPessoa

Deixo o projeto VBA usado de exemplo neste artigo para DOWNLOAD.

Leia também:

– Outros posts de VBA e VB6

Programação Orientada a Objetos com VBA e VB6

– Listeners (por debaixo dos panos) <– relativo à Observer Pattern

– Observer Pattern C# e VB.net

Referências:

Leia sobre outros artigos de Design Patterns

Esta entrada foi publicada em Design Pattern, OOAD e POO, Projetos, Visual Basic 6.0 e VBA com as etiquetas , , , , , , , . ligação permanente.

Uma resposta a Re-aproveitando eventos no VBA – The Observer Pattern – Eventos em interfaces não dá …

  1. Pingback: Programação Orientada a Objetos com VBA / VB6 | Pedro Abs

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s