Ruby - widocznośc klas

0

W jednym pliku mam klasę A i B powiedzmy:

class A
 ...
 b = B.new("b")
 ...
end

oraz

class B 
 ...
 a = A.new("a")
end

Pominąłem w tych klasach konstruktory. Chodzi o to, że klasa A nie widzi klasy B, zatem nie mogę w szczególności w żadnej metodzie używać zmiennych typu B i tym bardziej ich zwracać. Co zrobić, aby klasa A widziała klasę B? Np. w C++ miałem możliwość napisania tylko deklaracji i definiowania klas w dowolnym momencie. Jak to zrobić w Ruby?

0

Zrobiłem coś takiego:

w jednym pliku umieścilem klasę A w drugim klasę B zaś w trzecim w nagłówku umieściłem:

load 'KlasaA.rb'
load 'KlasaB.rb'

i dalej wykonywałem jakieś proste operacje oraz tworzyłem obiekty z klasy A i B. Z tym nie ma żadnego problemu. Natomiast gdy

Natomiast gdy w pliku z klasą A umieściłem nagłówek load 'KlasaB.rb' to mimo to nie mogę w obrębie klasy A tworzyć obiektów klasy B. Zwracany jest błąd:
KlasaB.rb stack level too deep (SystemStackError)

0

Primo, nie używaj load chyba, że wiesz co robisz, użyj require.
Secundo, uważaj by nie wpaść w nieskończoną pętlę.
Tertio, jeśli chcesz mieć dostęp do klas w taki sposób (co IMHO jest bardzo złym pomysłem, i najczęściej błędem projektowym) to możesz zrobić tak:

class B; end

class A
  #...
end

class B
  #...
end
0

Nie sprawdziłem jeszcze czy to będzie działać, ale dlaczego jest to błąd projektowy? Przykładowo w C++ takie zabiegi są bardzo częste (tzn. najpierw deklarujemy wszystko co się da, a później gdzieś to się definiuje).

1 użytkowników online, w tym zalogowanych: 0, gości: 1