Sobrecarregando métodos em Ruby
Você quer criar duas versões diferentes de um método possuindo o mesmo nome: dois métodos que diferem entre si pelos argumentos que possuem. Porém, uma classe Ruby pode ter somente um método com um determinado nome (se você definir um método com o mesmo nome duas vezes, a definição do último método prevalece conforme visto no exemplo p038or.rb no tópico Sobrescrevendo métodos em Ruby). Dentro daquele método simples, então, você pode por a lógica que varia dependendo de quantos e que tipos de objetos foram passados a ele como argumentos.
Aqui está uma classe Retangulo que representa uma forma retangular num plano. Você pode instanciar um Retangulo de um dos dois jeitos: passando as coordenadas de seus cantos superior esquerdo e inferior direito, ou passando as coordenadas de seu canto superior esquerdo junto com seu tamanho e largura. Há apenas um método initialize, mas você pode chamá-lo como se houvessem dois.
1 # O construtor do Retangulo aceita argumento em ambas 2 # das seguintes formas: 3 # Retangulo.new([x_superior, y_esquerda], tamanho, largura) 4 # Retangulo.new([x_superior, y_esquerda], [x_inferior, y_direita]) 5 class Retangulo 6 def initialize(*args) 7 if args.size < 2 || args.size > 3 8 # modificar isto para lançar exceção, depois 9 puts 'Este metodo recebe 2 ou 3 argumentos' 10 else 11 if args.size == 2 12 puts 'Dois argumentos' 13 else 14 puts 'Tres argumentos' 15 end 16 end 17 end 18 end 19 20 Retangulo.new([10, 23], 4, 10) 21 Retangulo.new([10, 23], [14, 13])
O programa p037retangulo.rb, acima, está incompleto da perspectiva da classe Retangulo, mas é suficiente para demonstrar como é feita a sobrecarga de métodos. Lembre-se, também, que o método initialize recebe um número variável de argumentos.
Eu listei todos os pontos importantes que você precisa lembrar depois de concluir os seguintes tópicos: Incluindo outros arquivos, Classes abertas em Ruby, Herança, Sobrescrevendo métodos, Sobrecarregando métodos.
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