2010-12-28 12 views
145

Chciałbym sprawdzić, czy klasa dziedziczy z innej klasy, ale wydaje się, że nie istnieje metoda dla tego.Sprawdź, czy klasa Ruby jest podklasą innej klasy

class A 
end 

class B < A 
end 

B.is_a? A 
=> false 

B.superclass == A 
=> true 

Trywialny realizacja tego, co chcę, to:

class Class 
    def is_subclass_of?(clazz) 
    return true if superclass == clazz 
    return false if self == Object 
    superclass.is_subclass_of?(clazz) 
    end 
end 

ale spodziewałbym to już istnieje.

+1

'A.class # => Class'. Właśnie dlatego 'B.is_a? A' zwraca wartość false. – Wen

+0

co z 'kind_of?' – akostadinov

+1

'kind_of?' Sprawdza, czy obiekt jest _instance_ klasy. Nie, czy obiekt dziedziczy z klasy. – Confusion

Odpowiedz

288

Wystarczy użyć operatora

B < A # => true 
A < A # => false 

< lub użyć operatora <=

B <= A # => true 
A <= A # => true 
+0

Świetna wskazówka. Uwielbiam Ruby ... –

+0

To działa ... ciekawy, czy ktoś wie, dlaczego 'is_a?' Nie jest? Dzięki! –

+13

@Brian Ponieważ 'is_a?' Tłumaczy na * to wystąpienie *. 'B' nie jest instancją' A', 'B.new' jest jednak (' B.new.is_a? A # => true'). –

47

Dostępne są również:

B.ancestors.include? A 

ta nieznacznie różni się od (krótszy) Odpowiedź z B < A ponieważ B jest inc luded w B.ancestors:

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

B < B 
#=> false 

B.ancestors.include? B 
#=> true 

, czy nie jest to pożądane, zależy od przypadku użycia.

+21

Bardziej czytelne: 'B <= B' (ten sam wynik co' B.ancestors.include? B'). –

+0

Aktualizacja: Bezpośrednio poprzedzające rozwiązanie działa z wersją 1.9+, podczas gdy nie ma "przodków"? w 1.9. – Barry

+0

@Barry Nie widzę "przodków" wymienionych w żadnej odpowiedzi na tej stronie, w tym tej. Do czego się odnosisz? – Phrogz

Powiązane problemy