Herança em Ruby = DANGER

2 respostas
N

Em Ruby podemos dar um override em qualquer método, inclusive privates! (Isso mesmo, acredite se quiser!)

Como ter certeza que não estamos sem querer dando um override num método private da classe que estamos herdando?

Teria que ter uma coisa assim: “só faça override se não existir!”

Alguém já pensou nisso?

2 Respostas

le-silva

Oi nadele!

Override, de fato, só haverá se já existir o método em uma das classes ancestrais.

Agora, pra saber se um método já foi definido em alguma das classes ancestrais, basta verificar quais sãos os métodos da classe em questão...

class Mae
	def metodo_1
		puts '1'
	end
end

class Filha < Mae
	def metodo_2
		puts '2'
	end
end

puts Filha.instance_methods

O resultado desta execução será:

metodo_2
metodo_1
object_id
frozen?
eql?
methods
=~
to_a
tainted?
trap
taint
public_methods
dup
method
==
singleton_methods
is_a?
instance_eval
equal?
instance_variable_get
instance_of?
hash
inspect
__id__
clone
__send__
id
instance_variable_set
send
untaint
class
protected_methods
kind_of?
instance_variable_defined?
instance_variables
display
to_s
extend
freeze
private_methods
nil?
type
===
instance_exec
respond_to?

Viu os métodos metodo_2 e metodo_1 no topo da lista?

:arrow: Eu sei que não é exatamente o que você queria, mas acho que já ajuda. (Neste caso um IDE também vai bem.)

Abraço!

pcalcado

pcalcado@pcalcado:~$irb &gt;&gt; class A &gt;&gt; private &gt;&gt; def banana &gt;&gt; p 'b' &gt;&gt; end &gt;&gt; end =&gt; nil &gt;&gt; A.private_instance_methods.sort =&gt; [&quot;Array&quot;, &quot;Float&quot;, &quot;Integer&quot;, &quot;String&quot;, &quot;`&quot;, &quot;abort&quot;, &quot;active_gem_with_options&quot;, &quot;at_exit&quot;, &quot;autoload&quot;, &quot;autoload?&quot;, &quot;banana&quot;, &quot;binding&quot;, &quot;block_given?&quot;, &quot;callcc&quot;, &quot;caller&quot;, &quot;catch&quot;, &quot;chomp&quot;, &quot;chomp!&quot;, &quot;chop&quot;, &quot;chop!&quot;, &quot;eval&quot;, &quot;exec&quot;, &quot;exit&quot;, &quot;exit!&quot;, &quot;fail&quot;, &quot;fork&quot;, &quot;format&quot;, &quot;gem_original_require&quot;, &quot;getc&quot;, &quot;gets&quot;, &quot;global_variables&quot;, &quot;gsub&quot;, &quot;gsub!&quot;, &quot;initialize&quot;, &quot;initialize_copy&quot;, &quot;irb_binding&quot;, &quot;iterator?&quot;, &quot;lambda&quot;, &quot;load&quot;, &quot;local_variables&quot;, &quot;location_of_caller&quot;, &quot;loop&quot;, &quot;method_missing&quot;, &quot;open&quot;, &quot;p&quot;, &quot;print&quot;, &quot;printf&quot;, &quot;proc&quot;, &quot;putc&quot;, &quot;puts&quot;, &quot;raise&quot;, &quot;rand&quot;, &quot;readline&quot;, &quot;readlines&quot;, &quot;remove_instance_variable&quot;, &quot;scan&quot;, &quot;select&quot;, &quot;set_trace_func&quot;, &quot;singleton_method_added&quot;, &quot;singleton_method_removed&quot;, &quot;singleton_method_undefined&quot;, &quot;sleep&quot;, &quot;split&quot;, &quot;sprintf&quot;, &quot;srand&quot;, &quot;sub&quot;, &quot;sub!&quot;, &quot;syscall&quot;, &quot;system&quot;, &quot;test&quot;, &quot;throw&quot;, &quot;trace_var&quot;, &quot;trap&quot;, &quot;untrace_var&quot;, &quot;warn&quot;]

Mas a orma como se usa heraná em Ruby é bem dierente de Java. Não é muito comum que isso aconteça. Ruby parece com Smalltalk no sentido que coisas rivadas não são tão úteis assim.

Você teve aum problema em específico?

Criado 14 de março de 2008
Ultima resposta 14 de mar. de 2008
Respostas 2
Participantes 3