ГоловнаВсі публікаціїКатегоріїПро проєкт

Що таке наслідування в Ruby? Приклади поганого та гарного наслідування.

Зміст дописунатисність на посилання, щоб перейти до потрібного місця
В Ruby, як і в багатьох інших об'єктно-орієнтованих мовах програмування, наслідування - це механізм, за допомогою якого клас може успадковувати властивості та методи іншого класу. Клас, який успадковує, називається підкласом, а клас, від якого успадковується, - батьківським класом.

Приклад поганого наслідування в Ruby

class Animal
  def speak
    puts "Animal speaks"
  end
end

class Dog < Animal
  def speak
    puts "Dog barks"
  end
end

class Cat < Animal
  # Цей клас не визначає свій власний метод speak
end
У цьому прикладі клас Dog успадковує клас Animal, але клас Cat не надає свою власну реалізацію методу speak. Якщо ви спробуєте створити екземпляр класу Cat і викликати метод speak, він використовуватиме реалізацію з класу Animal. Це може бути проблемою, оскільки для кота більше властива відповідь - meow
Тобто ми очікуємо отримати текст 'Cat meows', а отримаємо 'Animal speaks'. Здається що це не дуже критично, але в класах, які відповідають за бізнес логіку це може привести до більших проблем. 
Ми можемо зробити наступне:
class Cat < Animal
  def speak
    puts "Cat meows"
  end
end
Це наче вирішує проблему. Але уявіть що класів і методів десятки або сотні. Цей підхід не є best practice.

Приклад гарного наслідування в Ruby

class Shape
  def initialize(color)
    @color = color
  end

  def draw
    puts "Drawing a #{@color} shape"
  end
end

class Circle < Shape
  def initialize(color, radius)
    super(color)
    @radius = radius
  end

  def draw
    puts "Drawing a #{@color} circle with radius #{@radius}"
  end
end

class Square < Shape
  def initialize(color, side_length)
    super(color)
    @side_length = side_length
  end

  def draw
    puts "Drawing a #{@color} square with side length #{@side_length}"
  end
end
У цьому прикладі є клас Shape, який є базовим класом для всіх геометричних фігур. Клас має атрибут color та метод draw, який виводить повідомлення про малювання.
Класи Circle та Square успадковують клас Shape і надають власні атрибути (radius та side_length) та реалізацію методу draw. Кожен клас може викликати метод draw, але з власним контекстом та даними.
Цей підхід дозволяє створювати загальні властивості та методи в базовому класі, а потім розширювати їх у підкласах, забезпечуючи власну унікальну логіку. Це робить код більш читабельним, підтримуваним та гнучким.
24.07.2023 12:17

Як зробити Counter-Strike: GO в Ubuntu на весь екран не запускаючи гру?

meme code
meme code@memecode
20.11.2023 19:35

Як відновити видалений файл (Trix), який зберігався на Amazon S3?

meme code
meme code@memecode
29.11.2023 08:47

Чим відрізняється var від let в Javascript?

meme code
meme code@memecode
07.12.2023 07:42

Що таке інкапсуляція (encapsulation) в ООП?

meme code
meme code@memecode
07.12.2023 08:13

Контроль видимості в Ruby (public, private і protected)

meme code
meme code@memecode
07.12.2023 08:25

Що таке ООП (об'єктно-орієнтоване програмування)?

meme code
meme code@memecode
09.12.2023 12:15

Що таке best practice у програмуванні?

meme code
meme code@memecode
09.12.2023 12:21

Що таке поліморфізм? Приклад використання поліморфізму в Ruby.

meme code
meme code@memecode
09.12.2023 12:46

Що таке патерн/шаблон проєктування?

meme code
meme code@memecode
10.12.2023 14:03

Що таке патерн проєктування в програмуванні?

meme code
meme code@memecode
10.12.2023 14:18

Що таке клієнт і сервер? Яка механіка взаємодії між клієнтом та сервером?

meme code
meme code@memecode
18.12.2023 08:25

Що таке DNS? Для чого потрібна DNS?

meme code
meme code@memecode