Sobreposição (Overriding) de Métodos
Sobreposição de métodos (override) em programação orientada a objetos, é um recurso da linguagem que permite que a subclasse, rescreva uma implementação especifica de um método que já esta previsto em uma superclasse. A implementação na subclasse sobrepõe a implementação na superclasse.
Aqui esta um exemplo p037xmtdoverride.rb:
1 class A 2 def a 3 puts 'Na classe A' 4 end 5 end 6 7 class B < A 8 def a 9 puts 'Na classe B' 10 end 11 end 12 13 b = B.new 14 b.a
O Método na classe B sobrepôs o método na classe A.
A forma de se lidar com argumentos super:
Um exemplo (p038bicycle.rb) do livro Ruby for Rails enfatiza isso:
1 class Bicicleta 2 attr_reader :marchas, :rodas, :bancos 3 def initialize(gears = 1) 4 @rodas = 2 5 @bancos = 1 6 @marchas = gears 7 end 8 end 9 10 class Tandem < Bicicleta 11 def initialize(gears) 12 super 13 @bancos = 2 14 end 15 end 16 17 t = Tandem.new(2) 18 puts t.marchas 19 puts t.rodas 20 puts t.bancos 21 b = Bicicleta.new 22 puts b.marchas 23 puts b.rodas 24 puts b.bancos
A saída:
1 >ruby p038bicycle.rb 2 2 3 2 4 2 5 1 6 2 7 1 8 >Exit code: 0
Vamos falar com mais detalhes sobre attr_reader mais tarde.
(Adaptado do livro de David Black, Ruby for Rails)
Nada impede que você defina um método duas vezes. Programa p038or.rb:
1 class OR 2 def mtd 3 puts "Primeira definição do método mtd" 4 end 5 def mtd 6 puts "Primeira definição do método mtd" 7 end 8 end 9 OR.new.mtd
O que acontece quando chamamos o mtd em uma instancia de OR? Vamos descobrir:
1 OR.new.mtd
O resultado mostrado é a segunda definição do método mtd. A segunda definição é prevalecida: Nós vemos o resultado pela segunda, não pela primeira. Nada impede que você defina um método duas vezes, no entanto, a nova versão tem precedência.
Em Ruby, podemos definir uma classe abstrata como a que invoca certos métodos “abstratos” indefinidos, que é deixado para as subclasses definir. Por exemplo:
1 # Essa classe é abstrata, mais não define Ola ou Nome 2 # Nenhuma sintaxe especial é necessária: qualquer classe que invoca métodos 3 # que são destinados para uma subclasse é abstrata 4 5 class AbstractKlass 6 def bemvindo 7 puts "#{ola} #{nome}" 8 end 9 end 10 11 # uma classe concreta 12 class ConcreteKlass < AbstractKlass 13 def ola; "Ola"; end 14 def nome; "Estudantes de Ruby"; end 15 end 16 17 ConcreteKlass.new.bemvindo # imprime "Ola Estudantes de Ruby"
Este material tem como base o tutorial do RubyLearning.com de Satish Talim e foi traduzido por membros do GURU-SP com a permissão do autor.
Ajude o RubyLearning participando em algum dos cursos pagos ou fazendo uma doação para o projeto