> 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