Classes abertas em Ruby
No Ruby as classes nunca são fechadas: você pode sempre adicionar métodos a uma classe existente. Isso se aplica para classes que você escreve assim como para as classes padrões que vem com a linguagem. Tudo o que você tem que fazer é abrir a definição de uma classe existente e então o conteúdo será adicionado a mesma.
Veja o programa p031motorcycletest.rb do último tópico, e adicione o método mostraAttr
1 require 'p030motorcycle' 2 m = MotoCicleta.new('Yamaha', 'vermelha') 3 m.ligaMotor 4 5 class MotoCicleta 6 def mostraAttr 7 puts 'A cor da Motocicleta é ' + @cor 8 puts 'O fabricante da Motocicleta é ' + @fabricante 9 end 10 end 11 m.mostraAttr 12 m.ligaMotor 13 puts self.class 14 puts self
Perceba que self.class se refere a Object e self se refere a um objeto chamado main da classe Object.
Mais um exemplo é o programa – p031xdognext.rb
1 require 'p029dog' 2 # define a classe Cachorro 3 class Cachorro 4 def late_alto 5 puts 'AU! AU!' 6 end 7 end 8 # cria um objeto 9 d = Cachorro.new('Labrador', 'Benzy') 10 d.late 11 d.late_alto 12 d.display
Aqui está outro exemplo de se adicionar um método para a classe String. O programa p032mystring.rb ilustra o mesmo. Veja que o método que adicionamos não faz nada de novo, apenas chama o método size. Em um cenário real você adicionaria uma funcionalidade nova a String.
1 class String 2 def escreve_tamanho 3 self.size 4 end 5 end 6 escritor_de_tamanho = "Conte-me meu tamanho!" 7 puts escritor_de_tamanho.escreve_tamanho
(Você pode conferir a saída para os programas acima por conta própria).
Se você está escrevendo um novo método que conceitualmente pertence a classe original, você pode reabrir a classe e adicionar seu método a definição da mesma. Você deve apenas fazer isso se seu método tem utilidade genérica e você tem certeza que ele não entrará em conflito com um outro método definido por uma biblioteca que você pode incluir no futuro. Se o seu método não tem utilidade genérica, ou você não quer correr o risco de modificar uma classe após sua criação, crie uma subclasse da classe original. A subclasse pode sobrescrever seus métodos pais, ou adicionar novos. Isso é mais seguro porque a classe original e, qualquer código que dependa dela, não serão afetados.
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