Herança em Ruby = DANGER

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?

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…

[code]class Mae
def metodo_1
puts '1’
end
end

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

puts Filha.instance_methods[/code]

O resultado desta execução será:

[code]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?[/code]

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:~$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?