From: 7stud -- Date: 2007-11-08T12:03:36+09:00 Subject: Re: instantiating random sub-classes (Dragon, TeethDeer, etc Charles Lowe wrote: > Thufir wrote: >> In Driver, I was considering creating a pseudo-random number between 0 >> and 4, then using case: >> >> case 0 >> AssistantViceTentacleAndOmbudsman >> >> case 1 >> Dragon >> >> case 2 >> DwarvenAngel >> >> case 3 >> IntrepidDecomposedCyclist >> >> case 4 >> TeethDeer >> >> >> so that the array of Creatures is filled with a variety of monsters >> which inherit from Creature. However, there's gotta be another way. >> Perhaps ask Creature what its sub-classes are? Then randomly select >> from that list/array of monsters? >> >> Here's the code: >> >> C:\code> >> C:\code>type Driver.rb >> require 'ArrayOfCreatures' >> require 'Dragon' #Dragon inherits >> from Creature >> require 'Creature' #Subclasses >> include: Dragon, TeethDeer, etc >> >> #numOfCreatures=Kernel.rand(3) >> >> puts "\nquantity of creatures:" >> numOfCreatures = gets.chomp.to_i >> >> >> someCreatures = ArrayOfCreatures.new >> >> >> 0.upto(numOfCreatures) do |i| >> someCreatures[i]=Dragon.new #what about other >> types (children/sub-classes) of creature? >> print "\n" >> print "someCreatures[" >> print i >> print "]:\n" >> print someCreatures[i].toString >> end >> >> >> C:\code> >> >> >> thanks, >> >> Thufir > > There are two ways to get a list of subclasses. One is to use > ObjectSpace#each_object, which is kind of messy, and the other is to use > the Creature.inherited hook, to build up the array. An example of the Class.inherited method: class Creature def Creature.inherited(new_subClass_that_was_defined) puts new_subClass_that_was_defined end end class Monster1 < Creature end class Monster2 < Creature end class Monster3 < Creature end --output:-- Monster1 Monster2 Monster3 You can save those sub Classes in an array: class Creature def Creature.inherited(new_subClass_that_was_defined) puts new_subClass_that_was_defined if not defined?(@@subs) @@subs = [] end @@subs << new_subClass_that_was_defined end def Creature.subs #can access @@subs using: Creature.subs @@subs end end require 'creaturefile' require 'monsterfile' p Creature.subs -- Posted via http://www.ruby-forum.com/.