Olá pessoal, tudo certo?
Depois de aprender um pouco sobre Boo e trabalharmos um pouco a sintaxe, vamos nos dedicar a estudar uma característica mais “avançada” da linguagem Boo: a interface IQuackFu.
Vamos usar o SharpDevelop?!
Programar em Boo é muito bacana. Infelizmente, alguns desenvolvedores (eu incluso) estão tão acostumados com uma IDE que o “não-suporte” do Visual Studio se converte em um obstáculo quase intransponível.
Felizmente, há uma IDE open-source, muito bacana, chamada SharpDevelop que “salva” a casa. Abaixo, mostro um screenshot:
Recomendo fortemente que você baixe e instale o SharpDevelop para “brincar” com Boo.
IQuackFu
Se anda como pato e faz “quack” como um pato, então deve ser IQuackFu
Em algumas linguagens, geralmente dinâmicas, usa-se o termo duck typing ou method missing para designar o processo de binding em tempo de execução, ou late binding. Ou seja, não precisamos nos preocupar com o tipo de um objeto. Nem mesmo precisamos nos preocupar com as operações que ele suporta.
IQuackFu é a abordagem de Boo para prover suporte para late binding.
Essa interface define apenas três operações (bem mais simples que a abordagem da DLR, por exemplo). São elas:
- QuackGet(name: string, parameters : object[]) : object
- QuackInvoke(name: string, params args: object[]): object
- QuackSet(name: string, parameters: object[], value: object): object
QuackGet e QuackSet servem para “ligar” propriedades. QuackInvoke serve para “ligar” métodos.
Uma implementação simples de IQuackFu: PropertyBag
Para poder explicar como funciona a interface, vamos fazer uma implementação muito simples. Observe:
namespace IQuackFuProject import System import System.Collections public class PropertyBag(IQuackFu): _hash as Hashtable public def constructor(): _hash = Hashtable() def QuackInvoke(name as string, args as (object)) as object: pass def QuackGet(name as string, parameters as (object)) as object: if (_hash.ContainsKey(name)): return _hash[name] else : return null; def QuackSet(name as string, parameters as (object), value as object) as object: if (_hash.ContainsKey(name)): _hash[name] = value else : _hash.Add(name, value);
Alguns pontos a observar:
- É a primeira vez nessa série que mostro como definir um namespace. Simples, não?!
- Para poder aceitar uma “lista” como parâmetro, colocamos o tipo entre parênteses;
- Quando não desejamos implementar um método de uma interface, devemos utilizar a palavra chava “pass”.
Escrevendo um “código cliente”
Agora que temos uma classe implementando IQuackFu, vamos colocar as “mãos-na-massa”. Observe:
namespace IQuackFuProject import System bag = PropertyBag(); bag.Name = "Elemar Junior" bag.Age = 31 print bag.Name print bag.Age print "Press any key to continue . . . " Console.ReadKey(true)
Legal! Temos late binding ![]()
Executando o programa…
Perfeito!
Por hoje, era isso!






Publicado em 07/08/2011
0