From: Robert Klemme Date: 2005-08-26T21:13:52+09:00 Subject: Re: Circular dependecy on classes 2005/8/26, Anatol Pomozov : > I have several classes that have circular dependencies on each other. > See following example. > > class Solder > @can_upgrade_to = [Knight] > #or use constant from Knight class > > def upgrade!(to) > raise "Unable to upgrade" unless @can_upgrade_to.contain(to) > end > end > > class Knight < Solder > end > > I cant use Knight constant (class name) before Solder and can't use > Solder before Knight. > > I am just come from Java lang and for Java circular class deps is not > a problem. > But ruby is a dynamic language and it creates classes just on script > executing. (right?) > > So my questions is: how to solve this problem? What is the best way to > deal with it. The easiest soltuion: Reopen class Solder after you defined class Knight and put all the code there. But you can as well use #inherited to track all sub classes of Solder. Thus making sub class registration automatic. Something along the lines of (untested): class Solder def self.inherited(sub_class) def sub_class.inherited(cl) superclass.inherited(cl) end (@sub_classes ||= []) << sub_class end def upgrade_to?(cl) raise "error" unless cl.ancestors.include? cl ... end end Btw, did you mean "Soldier"? Kind regards robert