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.

Uso do super

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.

Redefinindo Métodos

(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.

Classe Abstrata

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"

Logo do Guru-SP

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

Voltar para o índice