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.

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