Creo que tienen el concepto equivocado aquí. Las clases en Ruby son similares a las clases en Java, Smalltalk, C#, ... y todas son plantillas para sus instancias. Entonces la clase define la estructura y el comportamiento si sus instancias, y las partes de la estructura y el comportamiento de las instancias de sus subclases pero no viceversa.
Así que el acceso directo de una superclase a una constante en una subclase no es posible en absoluto, y eso es algo bueno. Vea a continuación cómo solucionarlo. Para sus clases definidas, las siguientes cosas son ciertas:
class Animal
define el método make_noise
.
- instancias de
class Animal
pueden llamar al método make_noise
.
class Dog
define la constante NOISE
con su valor.
- instancias de
Dog
y la clase Dog
puede usar la constante NOISE
.
Lo que no es posible:
- Las instancias de la clase o
Animal
Animal
sí tienen acceso a las constantes de la clase Dog
.
Usted puede arreglar eso por el siguiente cambio:
class Animal
def make_noise
print Dog::NOISE
end
end
Pero esto es un mal estilo, porque ahora, su superclase (que es una abstracción sobre Dog
y otros animales) sabe ahora algo que pertenece a Dog
.
Una mejor solución sería:
- definir un método abstracto en la clase
Animal
cuales define que make_noise
deberían definirse. Ver la respuesta https://stackoverflow.com/a/6792499/41540.
- Defina en sus clases concretas el método de nuevo, pero ahora con la referencia a la constante.
Pero si utilizo una variable de instancia, eso significa que cada instancia de la clase Dog tendrá que almacenar los datos de ruido, ¿no? El ruido no cambiará entre las instancias de los perros (es decir, los perros siempre ladran), así que es por eso que pensé en una constante de subclase. ¿Qué piensas? – Tim
@Tim No, cada instancia de la clase Dog no almacena ese valor. 'p Dog.new.instance_eval {@noise} # => nil' La única instancia de la' Clase 'que se llama 'Dog' almacena ese valor. Así como las instancias de clases son objetos que pueden tener variables de instancia, las mismas clases son objetos (instancias de la clase Class) que pueden tener sus propias variables de instancia. – Phrogz
He actualizado el ejemplo para mostrar que estas son propiedades de 'Perro' en sí, no propiedades de instancias de Perro. Incluso podría cambiar 'attr_accessor' por' attr_reader' si quisiera reforzar su constancia. – Phrogz