Jak uzyskać nazwę klasy rodzica w Rubim

85

Załóżmy, że mam klasy Ai Bgdzie Bdziedziczy 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 :)

Rahul Tapali
źródło
4
kiedy utkniesz w ten sposób, zawsze próbuj B.methods.sortw irb. Może coś wskaże Ci nazwę metody, której szukasz.
Ivaylo Strandjev
@IvayloStrandjev To nie pomoże. Istnieje zbyt wiele metod przeglądania. To strata czasu.
sawa
@sawa nie jest prawdą. Zajęło mi to 30 sekund. Wystarczająco dużo, aby inni użytkownicy byli szybsi ode mnie, ale dość szybcy.
Ivaylo Strandjev
8
@checkit: dużo prostsze! 8.methods.grep(/class/)Nie musisz nawet sortować za pomocą tego rodzaju filtrowania :)
Sergio Tulentsev
@SergioTulentsev nice one !! to będzie naprawdę pomocne :)
Rahul Tapali

Odpowiedzi:

133
class A
end

class B < A
end

B.superclass # => A
B.superclass.name # => "A"
Sergio Tulentsev
źródło
62

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]
James S.
źródło
1
Pamiętaj, że obejmuje również moduły zawarte w klasie. Możesz zobaczyć, Arraypo Enumerablektórym następuje , który nie jest rodzicem, ale modułem zawartym w Array . Jeśli chcesz tylko zajęcia, możesz zrobić coś takiego Array.ancestors.select { |ancestor| ancestor.is_a? Class } #=> [Array, Object, BasicObject].
3limin4t0r
18

Mając obiekt (klasa utworzona), możesz wyprowadzić klasę nadrzędną

>> x = B.new
>> x.class.superclass.name
=>"A"
wwright
źródło
16

W przypadku, gdy Google sprowadzi tutaj każdego, kto pracuje w Railsach, zamiast tego możesz chcieć base_class, podobnie jak superclassprzejdzie 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_classdaje 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_classzwróci klasę klejnotu, a nie twoją.

Joel Fouse
źródło
8

Termin, którego szukasz, to superclass. I rzeczywiście możesz zrobić, B.superclassaby dostać A. (Możesz także zrobić B.ancestorslistę wszystkich klas i modułów, z których dziedziczy - coś w stylu [B, A, Object, Kernel, BasicObject]).

Gdakanie
źródło
2

Dziedziczenie to relacja między dwiema klasami. Dziedziczenie tworzy relację rodzic-dziecko między klasami. Jest to mechanizm umożliwiający ponowne wykorzystanie kodu i umożliwiający niezależne rozszerzenia oryginalnego oprogramowania za pośrednictwem publicznych klas i interfejsów. Zaletą dziedziczenia jest to, że klasy niższe w hierarchii uzyskują funkcje tych wyższych, ale mogą również dodawać własne specyficzne funkcje .

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.

Ruby od razu pokonuje dziedziczenie pojedynczej klasy, używając funkcji 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ż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.

 C.superclass
   => B
 B.superclass
  => A
 A.superclass
  => Object
 Object.superclass
  => BasicObject

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).

C.ancestors
 => [C, B, A, Mux, Object, Kernel, BasicObject]

Tutaj Mux i Kernel to moduły.

http://rubylearning.com/satishtalim/ruby_inheritance.html https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)

Mukesh Kumar Gupta
źródło