Dziedziczenie to relacja między dwiema klasami. Dziedziczenie tworzy relację rodzica podrzędnego między klasami . Jest to mechanizm służący do ponownego użycia kodu i pozwalający na niezależne rozszerzenie oryginalnego oprogramowania poprzez publiczne klasy i interfejsy. Zaletą dziedziczenia jest to, że klasy o niższej w dół hierarchii otrzymują cechy wyżej wymienionych, , ale mogą również dodawać określone cechy własne.
W Rubim klasa może odziedziczyć tylko jedną klasę. (np. klasa może dziedziczyć z klasy dziedziczącej z innej klasy, która dziedziczy z innej klasy, ale pojedyncza klasa nie może dziedziczyć jednocześnie z wielu klas). Klasa BasicObject jest klasą nadrzędną wszystkich klas w Ruby. Dlatego jego metody są dostępne dla wszystkich obiektów, chyba że zostały wyraźnie nadpisane.
Ruby przezwyciężają dziedziczenie pojedynczej klasy jednocześnie za pomocą mixin.
Spróbuję wyjaśnić na przykładzie.
module Mux
def sam
p "I am an module"
end
end
class A
include Mux
end
class B < A
end
class C < B
end
class D < A
end
można śledzić za pomocą class_name.superclass.name i zrobić ten proces, jeśli nie znaleziono BasicOject w tej hierarchii. BasicObject to super klasa o każdej klasie. zobaczmy, przypuśćmy, że chcemy zobaczyć drzewo hierarchii klasy C.
C.superclass
=> B
B.superclass
=> A
A.superclass
=> Object
Object.superclass
=> BasicObject
Można zobaczyć całą hierarchię klasy C. Punkt zauważyć stosując takie podejście nie znajdziemy moduły, które są zawarte lub poprzedzany w klasach nadrzędnych.
Istnieje inne podejście do znalezienia pełnej hierarchii, w tym modułów. Według Ruby doc ancestors. Zwraca listę modułów zawartych/dodanych w mod (w tym sam mod).
Tutaj, Mux i Kernel są modułami.
http://rubylearning.com/satishtalim/ruby_inheritance.html https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)
gdy zatrzymany jak to zawsze staram 'B.methods.sort' w IRB. Może coś da ci wskazówkę na temat nazwy metody, której szukasz. –
@IvayloStrandjev To nie pomoże. Jest zbyt wiele metod do przejrzenia. To strata czasu. – sawa
@sawa nie jest prawdą. Zajęło mi to 30 sekund. Dość, aby inni użytkownicy byli szybsi ode mnie, ale dość szybko. –