自定义类实例化其超类对象

时间:2013-03-04 19:55:53

标签: ruby inheritance matrix

我正在处理一个继承自Matrix

的Grid类
class Grid < Matrix
  def self.[](x,y=x)
    if x.is_a? String
      ary = x.lines.map { |l| l.strip.split('|') }.map.with_index do |col,x|
        col.map.with_index { |cell,y| ::Cell.new x: x, y: y, alive: !!(cell =~ /O/i) }
      end
      super *ary
    else
      super *Array.new(y) { [::Cell.new(x: x, y: y, alive: [true,false].sample)] * x }
    end
  end
end

我似乎无法覆盖::initialize,因为它是私有的。上面的工作,但产生Matrix类的实例而不是我的自定义类,所以我卡住了。实现我的课程在调用to_s和接收"Matrix[[X,O],[O,O]]"时没有实例化。我缺少什么?

1 个答案:

答案 0 :(得分:0)

ruby​​中没有::new方法,您可以通过#initialize

进行定义

当你打电话给super时,它会使用提供的参数调用Matrix::[]

查看source code

def Matrix.[](*rows)
  Matrix.rows(rows, false)
end

您可以尝试使用您的逻辑来定义Grid::rows。或者只是覆盖#initialize


顺便说一下,写得不好,他们应该rows(rows,false)(没有Matrix)来防止这个问题。