【问题标题】:Ruby - class inheritance and redefining initialize to work with factory methodsRuby - 类继承和重新定义初始化以使用工厂方法
【发布时间】:2014-01-09 05:13:28
【问题描述】:

我不确定这里的继承发生了什么。我得到这个代码的零值。但是当我不覆盖初始化方法并传入哈希参数时,就像温度类接受 (:c => 50) 一样,它工作正常。

我认为也许工厂方法再次调用了现在已更改的初始化方法?但后来我会认为我得到了一个循环..

谢谢。下面是代码段。这是我对 r-spec 教学资源的解决方案

我想我的问题是:

为什么 self.from_celsius 方法会创建一个不调用转换方法的新实例对象,因为温度中定义的初始化方法应该如此?

class Temperature

    ######################## -- getter methods 
    def in_fahrenheit 
        @in_fahrenheit
    end 

    def in_celsius
        @in_celsius
    end

    ######################## -- initialize and call the calculations
    def initialize(hash)
        @options = hash
        conversion
    end

    ######################## -- calculations
    def conversion
        @options.key?(:c) ? @in_fahrenheit = (9.0/5.0*@options[:c].to_f) + 32.0 : @in_fahrenheit = @options[:f]
        @options.key?(:f) ? @in_celsius = (5.0/9.0)*(@options[:f].to_f - 32.0) : @in_celsius = @options[:c]
    end 

    ######################## -- factory methods
    def self.from_celsius(c)
        self.new(:c => c)
    end

    def self.from_fahrenheit(f)
        self.new(:f => f)
    end
end


class Celsius < Temperature
    def initialize(c)
        Temperature.from_celsius(c)
    end
end

class Fahrenheit < Temperature
    def initialize(f)
        Temperature.from_fahrenheit(f)
    end
end


x = Celsius.new(50).in_celsius

puts x.nil?
#=> true

【问题讨论】:

  • 你有什么问题?
  • 问题:为什么 self.from_celsius 方法使用温度类作为模板创建一个新的实例对象,但最终没有为类变量赋值
  • 已编辑以包含问题

标签: ruby initialization temperature


【解决方案1】:

这将按照你想要的方式工作:

class Celsius < Temperature
    def initialize(c)
        super(c: c)
    end
end

class Fahrenheit < Temperature
    def initialize(f)
      super(f: f)
    end
end

不过,您应该记住,继承并不是一个很好的用途。

您的代码不起作用的原因是初始化程序不应该返回新创建的对象。新调用创建对象,初始化器只是初始化它。你也应该使用attr_accessor 来清理你的getter 代码。

【讨论】:

  • 谢谢。所以基本上将初始化参数重新格式化为正确的格式?为什么它以前不起作用?
  • 是的,没错。我只是在调用您在Temperature 中定义的初始化程序。它以前不起作用,因为您没有调用任何代码在new 创建的对象上设置@in_celsius@in_farenheit。初始化程序只是返回正确的对象,但初始化程序的返回值不是 new 调用中分配的值。初始化器的返回值基本上被忽略了。
  • 除了Celsius初始化方法调用的是Temperature构造方法,该构造方法使用重新格式化的参数调用Temperature初始化方法。它应该为 @in_.. 变量赋值。我仍然不明白为什么这不起作用
  • 它正在做你所说的,但它是在另一个对象上做的。 initializenew 创建的对象进行操作。在您调用工厂方法时创建的另一个温度对象的初始化器内部,与 new 创建的对象不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多