Search code examples
rubyoopinheritancefactory-patternclass-variables

Access super variables using class object


Heey I am new to Ruby. I need to create a factory method, which will return me an object of a class. Using that object I should be able to access the variables of the class. I have written the following code, but I surely have miss something.

class Super
  @@super_temp = 1

  def Super.get_instance(world)          
    platform = world
    if @@instance == nil
      if platform==1
        @@instance = BaseA.new
      else
        @@instance = BaseB.new
      end
    end
    return @@instance
  end
end

class BaseA < Super    
  @@base_temp = 2      
end


class BaseB < Super
  @@base_temp = 3    
end


class Demo
  def Demo.call_demo
    obj = Super.get_instance(0)

    puts "---------temp is #{obj.base_temp}"      
  end
end

Demo.call_demo

I need to retrieve the value of base_temp in class Demo.


Solution

  • Don't use @@ (Why should we avoid using class variables @@ in rails?) - @ solves your problem just as easily.

    Aside from that, all that is missing in your code is a getter:

    class Super
      @super_temp = 1
    
      def Super.get_instance(world)          
        platform = world
        if @instance == nil
          if platform==1
            @instance = BaseA.new
          else
            @instance = BaseB.new
          end
        end
        return @instance
      end
    
      def base_temp
        self.class.base_temp
      end
    
      def self.base_temp
        @base_temp
      end
    end
    
    class BaseA < Super    
      @base_temp = 2      
    end
    
    
    class BaseB < Super
      @base_temp = 3    
    end
    
    
    class Demo
      def Demo.call_demo
        obj = Super.get_instance(0)
    
        puts "---------temp is #{obj.base_temp}"      
      end
    end
    
    Demo.call_demo
    # ---------temp is 3
    

    The instance getter (implemented as self.class.base_temp) calls the class method base_temp of the instance's class. If we add prints of the internal products of the function, you can have some insights about its internals:

    class Super
      def base_temp
        p self
        p self.class
        p self.class.base_temp
      end
    end
    
    BaseA.new.base_temp
    # #<BaseA:0x000000027df9e0>
    # BaseA
    # 2
    
    BaseB.new.base_temp
    # #<BaseB:0x000000027e38b0>
    # BaseB
    # 3