Páginas

quarta-feira, 30 de março de 2011

Orientação a Objetos no VBA - Parte II

Mês corrido sem nenhuma postagem aqui no blog, mas para o mês não passar em branco vamos dar continuidade à orientação a objetos no VBA.

Uma maneira que sempre vejo as pessoas explicando classes, diz que uma maneira de entendê-las é pensando num animal.

Um animal é um ser vivo. Porém não podemos dizer que todos são iguais, cada um tem suas características (propriedades) e suas ações (métodos), pois bem, em nosso exemplo usaremos esta idéia para desenvolver nossas classes.

Neste exemplo criaremos diversas classes, todas elas serão derivadas (Herança) da classe Animal, e cada uma das outras classes terão os mesmos métodos com cada uma executando uma ação distinta , isto em orientação a objetos é chamado de polimorfismo,sendo capacidade do objeto assumir diversas formas em sua existência (instância).

Bom vamos lá!

Inserindo um Módulo de classe no nosso projeto, chamaremos esta classe de Animal, nela será inserido o seguinte código

Public Property Let Sou(nValue As String)
End Property

Public Property Get Sou() As String
End Property

Public Function Falar()
End Function

Public Function Mostrar()
End Function

Repare que os métodos definidos estão vazios, porque na verdade a implementação (guarde este nome) desta classe será feita nas classes derivadas dela.

Agora iremos criar um segundo módulo de classe, este será chamado de Cachorro, ora se o cachorro é um animal ele (no nosso exemplo) irá possuir os dois métodos que definimos Falar e Mostrar, mas como digo ao meu cachorro que ele é um cachorro? (no programa viu)

O Código para a classe que criamos é o seguinte

Implements Animal

Private nValor As String

Private Function Animal_Falar() As Variant
      Application.Speech.Speak "au au au"
End Function

Private Function Animal_Mostrar() As Variant
      MsgBox nValor & ":Au Au"
End Function

Private Property Let Animal_Sou(Tipo_Animal As String)
      nValor = Tipo_Animal
End Property

Private Property Get Animal_Sou() As String
      Animal_Sou = nValor
End Property

Analisando este código vemos que a primeira linha utiliza o implements , neste momento o nosso cachorro fica sabendo que é um animal!

Depois definimos os métodos que serão ativados quando o nosso Animal (neste caso um cachorro) for criado, nos métodos Animal_Falar e Animal_Mostrar definimos as ações que serão executadas.

Nas Linhas Get/Let Animal_Sou , definimos ao animal de qual tipo ele será. Com o Let definimos o valor, e por isto é necessário uma váriavel local declarada como NValor, de onde será retornada quando utilizarmos o Get.

Seguindo esta mesma Lógica, criaremos mais duas Classes, a Gato com o seguinte código

'Classe Gato
Implements Animal

Private nValor As String

Private Function Animal_Falar() As Variant
      Application.Speech.Speak "miau miau"
End Function
Private Function Animal_Mostrar() As Variant
      MsgBox nValor & ":Miau Miau"
End Function

Private Property Let Animal_Sou(Tipo_Animal As String)
      nValor = Tipo_Animal
End Property

Private Property Get Animal_Sou() As String
      Animal_Sou = nValor
End Property

E a classe Homem (Sim somos animais, como alguns políticos sempre me fazem o desprazer de lembrar)

'Classe Homem

Implements Animal

Private nValor As String
Private Function Animal_Falar() As Variant
      Application.Speech.Speak "oi tudo bem?"
End Function

Private Function Animal_Mostrar() As Variant
      MsgBox nValor & ": Eu Falo, penso, logo existo!"
End Function

Private Property Let Animal_Sou(Tipo_Animal As String)
      nValor = Tipo_Animal
End Property

Private Property Get Animal_Sou() As String
      Animal_Sou = nValor
End Property

Para este exemplo usaremos estas classes...

Agora realmente vem a implementação das classes criadas...Crie um formulário , nele coloque um combobox, e dois botões. Mantenha os mesmos nomes de criação.

Para o formulário utilize o seguinte código:

Private Sub CommandButton1_Click()
'Instancia a classe animal, e define qual o animal selecionado no combo, executando a ação Falar
Dim ObjAnimal As Animal
      Select Case ComboBox1
      
      Case "Cachorro"
            Set ObjAnimal = New Cachorro
      Case "Gato"
            Set ObjAnimal = New Gato
      Case "Homem"
            Set ObjAnimal = New Homem
      End Select
      
acao "f", ObjAnimal

Set ObjAnimal = Nothing

End Sub

Private Sub CommandButton2_Click()
'Instancia a classe animal, e define qual o animal selecionado no combo, executando a ação Mostrar
Dim ObjAnimal As Animal
      Select Case ComboBox1
      
      Case "Cachorro"
            Set ObjAnimal = New Cachorro
      Case "Gato"
            Set ObjAnimal = New Gato
      Case "Homem"
            Set ObjAnimal = New Homem
      End Select
      
acao "m", ObjAnimal

Set ObjAnimal = Nothing


End Sub

Private Sub UserForm_Initialize()
'Preenche o comboBox
      ComboBox1.Clear
      
      ComboBox1.AddItem "Cachorro"
      ComboBox1.AddItem "Gato"
      ComboBox1.AddItem "Homem"
      
End Sub

Sub acao(x As String, obj As Animal)
'Selecione qual a ação selecionada de acordo com o botão...
Select Case x
      Case "f"
            obj.Falar
      Case "m"
            obj.Sou = ComboBox1.Text
            obj.Mostrar
End Select
End Sub

Agora temmos tudo que precisamos para testar os conceitos de herança e polimorfismo no VBA.

Execute o formulário, selecionando as opções no combo e clicando nos botões. Caso seja selecionado o Falar o Excel irá emitir o som, no mostrar ele irá exibir um msgbox com a seleção feita.

Meu formulário foi criado da seguinte maneira...



BAIXE AQUI O EXEMPLO

[]'s

E até a próxima

6 comentários:

José Arnaldo disse...

Aqui deu erro:

Sub acao(x As String, obj As Animal

Erro de Compilação:
O tipo definido pelo usuário não foi definido.

Bruno Leite disse...

José baixe o exemplo que anexei no POST, ele esta igual ao POST pois foi a origem do mesmo.

Teste ai e qualquer coisa fale.

José Arnaldo disse...

É no seu exemplo deu certinho. Estranho é que fiz e refiz passo a passo e não deu certo. Devo ter feito algo errado.

Muito obrigado pela sua atenção e parabéns pelo seu Blog está demais.

Bruno Leite disse...

Valeu José!

São Paulo F.C. disse...

muito show!!!

a orientação objetos deixa tudo mais bonito.

Unknown disse...

Bom post.

Postar um comentário

Related Posts Plugin for WordPress, Blogger...