Eustáquio,

gostaria de agradecer a explicação que você me deu, pois foi perfeita!

On 4/14/07, "Eustáquio Rangel de Oliveira Jr." <[EMAIL PROTECTED]>
wrote:

> Estive estudando sobre Interfaces em Ruby. Estive estudando o exemplo
> dado pelo material do TaQ.
> Fazendo uma analogia com Java, não ficou muito claro, pois uma interface
> é uma espécie de contrato, contudo da forma como se dá em Ruby restringe
> a apenas os métodos que foram implementados no module.

Mas aí que tá. O contrato da interface fica válido em Java no momento que
você
compila o fonte e é feita a verificação dos métodos da interface na
classe, como
reza ali a cartilha das linguagens de tipagem estática.

Em Ruby, temos o comportamento do duck typing, onde o que importa é o que
um
objeto pode fazer, e não o seu tipo, e verificamos isso no runtime. Se
você
quiser forçar a checagem do tipo da sua classe que incorporou a
funcionalidade
do módulo, poderia ter algo do tipo:

module InterfaceSimulator
        def metodo_interface_1
                puts "Método interface 1"
        end
        def metodo_interface_2
                puts "Método interface 2"
        end
end

class TesteInterface
        include InterfaceSimulator
end

def teste(objeto)
        if objeto.is_a?(TesteInterface)
                puts "Ok, seu objeto confere."
                objeto.metodo_interface_1
        else
                puts "Não consigo fazer nada aqui."
        end
end

interface = TesteInterface.new
teste(interface)
teste(String.new)

Rodando o programa:

Ok, seu objeto confere.
Método interface 1
Não consigo fazer nada aqui.

Mas mesmo assim, pela característica dinâmica da linguagem, seria melhor
checar
não o tipo, mas se o objeto responde a uma certa funcionalidade (se anda
como um
pato, é tratado como um pato). Olha só:

module InterfaceSimulator
        def metodo_interface_1
                puts "Método interface 1"
        end
        def metodo_interface_2
                puts "Método interface 2"
        end
end

class TesteInterface
        include InterfaceSimulator
end

def teste(objeto)
        if objeto.respond_to?(:metodo_interface_1)
                puts "Ok, seu objeto confere."
                objeto.metodo_interface_1
        else
                puts "Não consigo fazer nada aqui."
        end
end

interface1 = TesteInterface.new
interface2 = TesteInterface.new

class << interface2
        undef_method :metodo_interface_1
end

teste(interface1)
teste(interface2)

Rodando o programa:

Ok, seu objeto confere.
Método interface 1
Não consigo fazer nada aqui.

Ou seja, eu removi o método do segundo objeto durante o runtime, e mesmo
ele
sendo do tipo desejado ele não tem agora a funcionalidade esperada. Se
você for
"amarrar" de algum jeito, eu recomendaria esse, e não pelo tipo.

Não sei até que ponto isso fere a "pureza" do conceito OO da uma
interface, mas ...

[]'s!

--
Eustáquio "TaQ" Rangel
http://eustaquiorangel.com

"Fools ignore complexity; pragmatists suffer it; experts avoid it;
geniuses
remove it."
A. Perlis
_______________________________________________
Ruby-l mailing list
[EMAIL PROTECTED]
http://www.listas.unicamp.br/mailman/listinfo/ruby-l




--
Ramon Lopes
Diretor de Recursos Humanos - 2007
InfoJr UFBA - Empreendendo o futuro
(71) - 3263-6268
http://www.infojr.ufba.br
_______________________________________________
Ruby-l mailing list
[EMAIL PROTECTED]
http://www.listas.unicamp.br/mailman/listinfo/ruby-l

Responder a