Załóżmy, że mam klasy A
i B
gdzie B
dziedziczy A
. Jak wydrukować nazwę klasy nadrzędnej wB
class A
end
class B < A
end
Próbowałem niektórych rzeczy
>> B.new.class #=> B #which is correct
>> B.new.parent #=> Undefined method `parent`
>> B.parent #=> Object
>> B.parent.class #=> Class
Dzięki :)
B.methods.sort
w irb. Może coś wskaże Ci nazwę metody, której szukasz.8.methods.grep(/class/)
Nie musisz nawet sortować za pomocą tego rodzaju filtrowania :)Odpowiedzi:
class A end class B < A end B.superclass # => A B.superclass.name # => "A"
źródło
Jeśli chcesz mieć pełny stos przodków, spróbuj:
object.class.ancestors
Na przykład:
> a = Array.new => [] > a.class.ancestors => [Array, Enumerable, Object, Kernel, BasicObject]
źródło
Array
poEnumerable
którym następuje , który nie jest rodzicem, ale modułem zawartym w Array . Jeśli chcesz tylko zajęcia, możesz zrobić coś takiegoArray.ancestors.select { |ancestor| ancestor.is_a? Class } #=> [Array, Object, BasicObject]
.Mając obiekt (klasa utworzona), możesz wyprowadzić klasę nadrzędną
>> x = B.new >> x.class.superclass.name =>"A"
źródło
W przypadku, gdy Google sprowadzi tutaj każdego, kto pracuje w Railsach, zamiast tego możesz chcieć
base_class
, podobnie jaksuperclass
przejdzie przez strukturę dziedziczenia ActiveRecord.class A < ActiveRecord::Base end class B < A end > A.superclass => ActiveRecord::Base > B.superclass => A > A.base_class => A > B.base_class => A
Nawet dalej...
class C < B end > C.base_class => A
Innymi słowy,
base_class
daje początek drzewa dziedziczenia, ale ogranicza się do kontekstu aplikacji. Uczciwe ostrzeżenie, jeśli chodzi o Railsy, "twoja aplikacja" zawiera wszystkie używane przez ciebie klejnoty, więc jeśli masz model, który zawiera podklasy coś zdefiniowanego w gem,base_class
zwróci klasę klejnotu, a nie twoją.źródło
Termin, którego szukasz, to
superclass
. I rzeczywiście możesz zrobić,B.superclass
aby dostaćA
. (Możesz także zrobićB.ancestors
listę wszystkich klas i modułów, z których dziedziczy - coś w stylu[B, A, Object, Kernel, BasicObject]
).źródło
W Rubim klasa może dziedziczyć tylko z jednej innej klasy. (tj. klasa może dziedziczyć po klasie, która dziedziczy po innej klasie, która dziedziczy po innej klasie, ale jedna klasa nie może dziedziczyć z wielu klas jednocześnie). Klasa BasicObject jest klasą nadrzędną wszystkich klas w Rubim. Dlatego jego metody są dostępne dla wszystkich obiektów, chyba że zostaną jawnie zastąpione.
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żesz śledzić, używając nazwa_klasy.superclass.name i wykonywać ten proces, chyba że znalazłeś BasicOject w tej hierarchii. BasicObject to super klasa dla wszystkich klas. zobaczmy, że chcemy zobaczyć drzewo hierarchii klasy C.
Możesz zobaczyć całą hierarchię klasy C. Zwróć uwagę, że używając tego podejścia nie znajdziesz modułów, które są dołączone lub dołączone do klas nadrzędnych.
Istnieje inne podejście do znalezienia pełnej hierarchii, w tym modułów. Według przodków Ruby doc . Zwraca listę modułów dołączonych / dołączonych do moda (w tym sam mod).
Tutaj Mux i Kernel to moduły.
http://rubylearning.com/satishtalim/ruby_inheritance.html https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)
źródło