Cała oryginalna treść jest tworzona po ukraińsku. Nie wszystkie treści zostały jeszcze przetłumaczone. Niektóre posty mogą być dostępne tylko po ukraińsku.Dowiedz się więcej

Czym jest dziedziczenie w Ruby? Przykłady złego i dobrego dziedziczenia.

Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
W Ruby, jak i w wielu innych obiektowo-orientowanych językach programowania, dziedziczenie to mechanizm, dzięki któremu klasa może dziedziczyć właściwości i metody innej klasy. Klasa, która dziedziczy, nazywana jest podklasą, a klasa, od której się dziedziczy, - klasą nadrzędną.

Przykład złego dziedziczenia w Ruby

class Animal
  def speak
    puts "Animal speaks"
  end
end

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

class Cat < Animal
  # Ta klasa nie definiuje swojej własnej metody speak
end
W tym przykładzie klasa Dog dziedziczy klasę Animal, ale klasa Cat nie dostarcza własnej implementacji metody speak. Jeśli spróbujesz stworzyć instancję klasy Cat i wywołać metodę speak, użyje ona implementacji z klasy Animal. Może to być problemem, ponieważ dla kota bardziej odpowiednia jest odpowiedź - meow
Oczekujemy otrzymać tekst 'Cat meows', a otrzymujemy 'Animal speaks'. Wydaje się, że to nie jest bardzo krytyczne, ale w klasach odpowiedzialnych za logikę biznesową może to prowadzić do większych problemów. 
Możemy zrobić następujące:
class Cat < Animal
  def speak
    puts "Cat meows"
  end
end
To zdaje się rozwiązywać problem. Ale wyobraź sobie, że klas i metod jest dziesiątki lub setki. To podejście nie jest najlepszą praktyką.

Przykład dobrego dziedziczenia w 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
W tym przykładzie jest klasa Shape, która jest klasą bazową dla wszystkich figur geometrycznych. Klasa ma atrybut color oraz metodę draw, która wyświetla komunikat o rysowaniu.
Klasy Circle i Square dziedziczą klasę Shape i dostarczają własne atrybuty (radius i side_length) oraz implementację metody draw. Każda klasa może wywołać metodę draw, ale z własnym kontekstem i danymi.
To podejście pozwala na tworzenie wspólnych właściwości i metod w klasie bazowej, a następnie ich rozszerzanie w podklasach, zapewniając własną unikalną logikę. To sprawia, że kod jest bardziej czytelny, łatwiejszy w utrzymaniu i elastyczny.

Ten post nie ma jeszcze żadnych dodatków od autora.

24 lip 12:17

Jak ustawić Counter-Strike: GO w Ubuntu na pełny ekran bez uruchamiania gry?

meme code
meme code@memecode
20 lis 19:35

Jak przywrócić usunięty plik (Trix), który był przechowywany na Amazon S3?

meme code
meme code@memecode
29 lis 08:47

Czym różni się var od let w Javascript?

meme code
meme code@memecode
7 gru 07:42

Czym jest enkapsulacja (encapsulation) w OOP?

meme code
meme code@memecode
7 gru 08:13

Kontrola widoczności w Ruby (public, private i protected)

meme code
meme code@memecode
7 gru 08:25

Czym jest OOP (programowanie obiektowe)?

meme code
meme code@memecode
9 gru 12:15

Czym są najlepsze praktyki w programowaniu?

meme code
meme code@memecode
9 gru 12:21

Czym jest polimorfizm? Przykład użycia polimorfizmu w Ruby.

meme code
meme code@memecode
9 gru 12:46

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

meme code
meme code@memecode
10 gru 14:03

Czym jest wzorzec projektowy w programowaniu?

meme code
meme code@memecode
10 gru 14:18

Czym jest klient i serwer? Jaka jest mechanika interakcji między klientem a serwerem?

meme code
meme code@memecode
18 gru 08:25

Co to jest DNS? Do czego potrzebny jest DNS?

meme code
meme code@memecode