Me gustaría probar si una clase hereda de otra clase, pero no parece existir un método para eso.
class A
end
class B < A
end
B.is_a? A
=> false
B.superclass == A
=> true
Una implementación trivial de lo que quiero sería:
class Class
def is_subclass_of?(clazz)
return true if superclass == clazz
return false if self == Object
superclass.is_subclass_of?(clazz)
end
end
pero esperaría que esto ya exista.
ruby
inheritance
subclass
superclass
Confusión
fuente
fuente
A.class #=> Class
. Es por eso queB.is_a? A
devuelve falso.kind_of?
kind_of?
prueba si un objeto es una instancia de una clase. No si el objeto hereda de una clase.kind_of?
es un alias deis_a?
Respuestas:
Solo usa el
<
operadoro usar el
<=
operadorfuente
is_a?
traduce en es instancia de .B
no es una instancia deA
,B.new
es aunque (B.new.is_a? A # => true
).También disponible:
Esto difiere ligeramente de la respuesta (más corta) de
B < A
porqueB
está incluida enB.ancestors
:Si esto es deseable o no depende de su caso de uso.
fuente
B <= B
(mismo resultado queB.ancestors.include? B
).include?
y recorren la cadena de antepasados . Hace esto en C, seguramente más rápido que recorrer la matriz de Ruby ... pero prácticamente los dos deberían ser indistinguibles.<
B
. Pero lo hace. La documentación del método dice: "Devuelve una lista de módulos incluidos / incluidos en el mod ( incluido el mod )". (énfasis mío). Supongo que incluye su propia clase por conveniencia cuando se usa.include?
, pero eso es solo especulación de mi parte.