Menu
Coddy logo textTech

Podklasy

Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 22 z 57.

Dziedziczenie tworzy nową klasę na podstawie istniejącej. class Dog < Animal sprawia, że Dog jest podklasą Animal, swojej nadklasy. Pies ma wszystkie metody zwierzęcia, w tym initialize, a także metody dodane przez Dog:

class Animal
  attr_reader :name

  def initialize(name)
    @name = name
  end

  def eat
    "#{name} is eating"
  end
end

class Dog < Animal
  def fetch
    "#{name} fetches the ball"
  end
end

rex = Dog.new("Rex")
puts rex.eat
puts rex.fetch

Wynik:

Rex is eating
Rex fetches the ball

Dodane metody należą tylko do podklasy. Zwykły Animal ich nie ma, a klasa siostrzana, taka jak Cat, nie widzi metod klasy Dog:

class Animal
  def breathe
    "breathing"
  end
end

class Dog < Animal
  def fetch
    "fetching"
  end
end

class Cat < Animal
end

puts Cat.new.breathe
begin
  Cat.new.fetch
rescue NoMethodError => e
  puts e.message
end

Wynik:

breathing
undefined method `fetch' for an instance of Cat

superclass wskazuje klasę nadrzędną danej klasy. Klasa w Ruby ma dokładnie jedną klasę nadrzędną, a klasa zadeklarowana bez < dziedziczy po Object, co zapewnia każdemu obiektowi metody takie jak to_s i inspect:

class Animal
end

class Dog < Animal
end

puts Dog.superclass
puts Animal.superclass
puts Object.superclass

Wynik:

Animal
Object
BasicObject

Dziedziczenie pasuje do relacji jest: pies jest zwierzęciem, konto oszczędnościowe jest kontem. Wspólne zachowanie umieszcza się raz w nadklasie, a każda podklasa dodaje to, co ją wyróżnia. W tej sekcji każda klasa znajduje się we własnym pliku, a plik nadklasy jest wczytywany jako pierwszy:

# main.rb
require_relative 'animal'   # najpierw klasa nadrzędna
require_relative 'dog'      # class Dog < Animal wymaga Animal
require_relative 'cat'
challenge icon

Wyzwanie

Łatwy

Uzupełnij klasy. Vehicle przechowuje name i liczbę wheels oraz ma metodę describe, która zwraca Mini has 4 wheels. Car i Bike są podklasami Vehicle, które nie definiują initialize. Car dodaje honk, która zwraca Mini says beep, a Bike dodaje ring, która zwraca BMX rings.

Dostarczony kod odczytuje wiersze car Mini lub bike BMX, tworzy obiekt Car z 4 kołami albo Bike z 2 kołami, a następnie wypisuje wynik describe, dźwięk (honk lub ring) oraz nadklasę klasy obiektu.

Umieść swój kod w plikach vehicle.rb, car.rb i bike.rb. main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

require_relative 'vehicle'
require_relative 'car'
require_relative 'bike'

# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input = []
while (line = gets)
  input << line.chomp
end
input.each do |line|
  kind, name = line.split(" ", 2)
  if kind == "car"
    v = Car.new(name, 4)
    sound = v.honk
  else
    v = Bike.new(name, 2)
    sound = v.ring
  end
  puts v.describe
  puts sound
  puts v.class.superclass
end
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Ruby online