Що таке поліморфізм в Ruby?

Поліморфізм в Ruby - це концепція об’єктно-орієнтованого програмування, яка означає здатність об’єктів реагувати на однакові повідомлення (методи) в різний спосіб, в залежності від їх типу або класу. Це дозволяє використовувати методи з однаковим ім’ям на різних класах з різними імплементаціями.

У Ruby він може бути реалізований за допомогою наслідування (унаслідування методів від батьківського класу), а також за допомогою використання модулів і міксінів для додавання специфічного функціоналу до різних класів. Це дозволяє використовувати однаковий інтерфейс для об’єктів різних типів, що спрощує роботу з кодом і робить його більш гнучким.

Поліморфізм в об’єктно-орієнтованому програмуванні означає, що різні об’єкти можуть відповідати на однакові повідомлення (методи) унікальними способами. У Ruby це означає, що ви можете мати об’єкти різних класів, які реалізовують один і той самий метод, але роблять це по-різному в залежності від свого контексту.

Наприклад, розглянемо класи Кіт та Собака, які наслідують від загального класу Тварина. У класі Тварина може бути метод звук, який повертає звук, який видає тварина. Коли ви викликаєте метод звук на об’єкті Кіт, він може повертати “М’яу”, а коли ви викликаєте його на об’єкті Собака, він може повертати “Гав”.

class Тварина
  def звук
    raise NotImplementedError, 'Потрібно реалізувати цей метод у підкласі'
  end
end

class Кіт < Тварина
  def звук
    'М\'яу'
  end
end

class Собака < Тварина
  def звук
    'Гав'
  end
end

кіт = Кіт.new
puts кіт.звук  # Виводить "М'яу"

собака = Собака.new
puts собака.звук  # Виводить "Гав"

У цьому прикладі метод звук є поліморфним, оскільки він повертає різні значення в залежності від типу об’єкта, на якому він викликається.

Поліморфізм в Ruby також можна досягти за допомогою модулів та міксінів, де різні класи можуть включати спільний функціонал, щоб додати функціональність до своїх об’єктів без спадкування від одного класу.

Отже, поліморфізм в Ruby дозволяє збільшувати гнучкість програми, дозволяючи обробляти об’єкти різних класів однаковим способом, що спрощує роботу з кодом і робить його більш зрозумілим та легшим для розширення.