2013-02-08 17 views
47

Załóżmy, że mam klasy A i B, gdzie B dziedziczy A. Jak mogę wydrukować nazwę klasy nadrzędnej w BJak uzyskać nazwę klasy rodzica w Ruby

class A 
end 

class B < A 
end 

Niektóre rzeczy próbowałem

>> B.new.class #=> B #which is correct 
>> B.new.parent #=> Undefined method `parent` 
>> B.parent #=> Object 
>> B.parent.class #=> Class 

Thanks :)

+3

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

+0

@IvayloStrandjev To nie pomoże. Jest zbyt wiele metod do przejrzenia. To strata czasu. – sawa

+0

@sawa nie jest prawdą. Zajęło mi to 30 sekund. Dość, aby inni użytkownicy byli szybsi ode mnie, ale dość szybko. –

Odpowiedz

83
class A 
end 

class B < A 
end 

B.superclass # => A 
B.superclass.name # => "A" 
8

Termin szukasz jest superclass. I rzeczywiście możesz zrobić B.superclass, aby uzyskać A. (Można również zrobić B.ancestors aby uzyskać listę wszystkich klas i modułów dziedziczy od -. Coś podobnego [B, A, Object, Kernel, BasicObject])

14

Biorąc obiekt (instancja klasy) można czerpać klasy nadrzędnej

>> x = B.new 
>> x.class.superclass.name 
=>"A" 
40

Jeśli chcesz pełną przodek stosu spróbować:

object.class.ancestors 

na przykład:

> a = Array.new 
=> [] 
> a.class.ancestors 
=> [Array, Enumerable, Object, Kernel, BasicObject] 
11

Na wypadek, gdyby google przyprowadził tutaj każdego, kto pracuje w Railsach, może ci się przydać base_class, jako że superclass będzie również przechodził 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 

Jeszcze dalej ...

class C < B 
end 

> C.base_class 
=> A 

Innymi słowy, base_class daje szczycie drzewa dziedziczenia, ale ograniczony do kontekstu aplikacji. Uczciwe ostrzeżenie jednak, jeśli chodzi o Rails, "twoja aplikacja" zawiera wszystkie klejnoty, których używasz, więc jeśli masz model, który podklasy określi coś zdefiniowanego w klejnocie, base_class zwróci klasę klejnotu, a nie twoją.

1

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)

Powiązane problemy