Class Variables for subclases

Hey Guys,

Check out the following:

class A
  @@anobject = 'green'
  def fun2
    @@anobject
  end
end

class B < A
  @@anobject = 'blue'
  def fun2
    @@anobject
  end
end

puts B.new.fun2 # blue
puts A.new.fun2 # blue

So it looks like the subclass B is not defining its own class variable
but reusing A's class variable @@anobject. Is there a different way to
specify class variables to overcome this issue?

Sonny.

···

--
Posted via http://www.ruby-forum.com/.

Hi,

Check out the following:

class A
@@anobject = 'green'
def fun2
   @@anobject
end
end

class B < A
@@anobject = 'blue'
def fun2
   @@anobject
end
end

puts B.new.fun2 # blue
puts A.new.fun2 # blue

So it looks like the subclass B is not defining its own class variable
but reusing A's class variable @@anobject. Is there a different way to
specify class variables to overcome this issue?

You can use constants-as-class-shared technique.

class A
  Anobject = ['green']
  def fun2
    Anobject[0]
  end
end

class B < A
  Anobject = ['blue']
  def fun2
    Anobject[0]
  end
end

puts B.new.fun2 # blue
puts A.new.fun2 # blue

···

In message "Re: Class Variables for subclases..." on Tue, 27 Mar 2007 11:37:38 +0900, Sonny Chee <sonny.chee@gmail.com> writes:

Sonny Chee wrote:

Hey Guys,

Check out the following:

class A
  @@anobject = 'green'
  def fun2
    @@anobject
  end
end

class B < A
  @@anobject = 'blue'
  def fun2
    @@anobject
  end
end

puts B.new.fun2 # blue
puts A.new.fun2 # blue

So it looks like the subclass B is not defining its own class variable
but reusing A's class variable @@anobject. Is there a different way to
specify class variables to overcome this issue?

Sonny.

You may find it more suitable to use instance variables in your class objects, and write accessors so you can get at them from instances of your classes.

For example:

class A
   @anobject = 'green'
   def self.anobject
     @anobject
   end
   def fun2
     self.class.anobject
   end
end

class B < A
   @anobject = 'blue'
end

puts B.new.fun2 # blue
puts A.new.fun2 # green

Google (or search the list) for 'ruby class instance variable'.

I think the 'traits' gem does this in a systematic way, though of course it's worth playing around to understand the concept first.

···

--
       vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Yukihiro Matsumoto wrote:

You can use constants-as-class-shared technique.

Thanks, Matz. For my edification, is there a reason why class variables
behave in this way when subclassed? Is this a feature of the language
or the Ruby Interpretter?

Sonny.

···

--
Posted via http://www.ruby-forum.com/\.

Thanks for the pointers Joel.

Sonny.

···

--
Posted via http://www.ruby-forum.com/.