myślę, że masz złą koncepcję tutaj. Klasy w Ruby są podobne do klas w Javie, Smalltalk, C#, ... i wszystkie są szablonami dla ich instancji. Klasa definiuje więc strukturę i zachowanie, jeśli chodzi o instancje oraz części struktury i zachowanie wystąpień jej podklas. , ale nie wice versa.
Tak więc bezpośredni dostęp z nadklasy do stałej w podklasie nie jest w ogóle możliwy, a to dobrze. Zobacz poniżej, jak to naprawić. Dla klas zdefiniowanych, następujące rzeczy są prawdziwe:
class Animal
definiuje metodę make_noise
.
- wystąpień
class Animal
może wywołać metodę make_noise
.
class Dog
definiuje stałą o wartości NOISE
.
- wystąpień
Dog
i sama klasa Dog
może używać stałej NOISE
.
Co nie jest możliwe:
- Przypadki
Animal
lub klasa Animal
sobie mieć dostęp do stałych klasy Dog
.
można naprawić przez następujące zmiany:
class Animal
def make_noise
print Dog::NOISE
end
end
Ale to jest zły styl, bo teraz, twój nadklasą (co jest abstrakcją o Dog
i inne zwierzęta) wie już coś, co należy do Dog
.
Lepszym rozwiązaniem byłoby:
- zdefiniować sposób abstrakcyjny w klasie
Animal
, który określa, że make_noise
powinien być określony. Zobacz odpowiedź https://stackoverflow.com/a/6792499/41540.
- Zdefiniuj ponownie w swoich klasach konkretnych metodę, ale teraz w odniesieniu do stałej.
Ale jeśli używam zmiennej instancji, oznacza to, że każda instancja klasy Dog będzie musiała przechowywać dane o szumach, prawda? Hałas nie zmieni się między instancjami Psów (tj. Psy zawsze szczekają), dlatego właśnie pomyślałem o stałej podklasy. Co myślisz? – Tim
@ Czas Nie, każda instancja klasy Dog nie przechowuje tej wartości. 'p Dog.new.instance_eval {@noise} # => nil' Pojedyncza instancja' Klasy' o nazwie 'Pies' przechowuje tę wartość. Podobnie jak instancje klas są obiektami, które mogą mieć zmienne instancji, więc same klasy są obiektami (instancjami klasy Class), które mogą mieć własne zmienne instancji. – Phrogz
Zaktualizowałem przykład, aby pokazać, że są to właściwości samego "psa", a nie właściwości instancji Dog. Możesz nawet zmienić 'attr_accessor' na' attr_reader', jeśli chcesz mocniej wzmocnić jego stałość. – Phrogz