【问题标题】:Access super variables using class object [closed]使用类对象访问超级变量
【发布时间】:2014-08-20 17:19:57
【问题描述】:

嘿,我是 Ruby 的新手。我需要创建一个工厂方法,它将返回一个类的对象。使用该对象,我应该能够访问该类的变量。我已经编写了以下代码,但我肯定错过了一些东西。

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

我需要在 Demo 类中检索 base_temp 的值。

【问题讨论】:

  • 你为什么要为此使用类变量?在任何情况下,类变量都不是这样工作的——也许可以查看一些讨论基础知识的 Ruby 教程。

标签: ruby oop inheritance factory-pattern class-variables


【解决方案1】:

不要使用@@ (Why should we avoid using class variables @@ in rails?) - @ 可以轻松解决您的问题。

除此之外,您的代码中缺少的只是一个 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

实例getter(实现为self.class.base_temp)调用实例类的类方法base_temp。如果我们添加函数内部产品的打印,您可以对其内部结构有所了解:

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

【讨论】:

  • 谢谢尤里。这真的很有帮助..
  • Hey Uri.. 我知道 是 getter 方法。您能否解释一下 是如何工作的。我不完全理解它的工作原理。此外,由于我有很多变量,因此创建那么多 setter getter 方法似乎不是理想的解决方案。
  • Super.get_instance 是有效的 Ruby 代码。但是,正如您所建议的,我们应该使用self.get_instance,因为类名的微小变化不需要更改其余代码。
  • @DarekNędza - 当然你是对的,我没有使用过这种语法,所以我忘记了它是合法的。以最小代码更改的名义,我完全删除了该观察结果。
  • @UriAgassi 工作正常。但我只是想知道,因为我的代码中有很多常量变量。我是否必须为每个变量编写那些 setter、getter 方法(这将是一个主要的代码块),还是有办法解决?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多