创建一个继承自Ruby中另一个类的类

时间:2012-06-19 00:28:14

标签: ruby-on-rails ruby ruby-on-rails-3

我正在尝试创建一个名为Musician的类,它继承自我的Person类,然后添加一个instrument属性。我知道我的音乐家课是错的,但我只是想知道Ruby中的正确格式是什么。这是我的所有代码:

class Person
  attr_reader :first_name, :last_name, :age
  def initialize (first_name, last_name, age)
    @first_name = first_name
    @last_name = last_name
    @age = age
  end
end

p = Person.new("Earl", "Rubens-Watts", 2)
p.first_name
p.last_name
p.age


class Musician < Person
  attr_reader :instrument
  def initialize (instrument)
    @instrument = instrument
  end
end

m = Musician.new("George", "Harrison", 58, "guitar")
m.first_name + " " + m.last_name + ": " + m.age.to_s
m.instrument

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

如果您希望在音乐家中使用first_name,last_name和age,则必须将它们包含在初始值设定项中并利用super。类似的东西:

class Musician < Person
  attr_reader :instrument

  def initialize(first_name, last_name, age, instrument)
    super(first_name, last_name, age)
    @instrument = instrument
  end
end

super在父类中调用具有相同名称的方法。

更新

我会把重点放在家里。在完全构成的情况下你也会使用super:

class GuitarPlayer < Person
  attr_reader :instrument

  def initialize(first_name, last_name, age)
    super(first_name, last_name, age)
    @instrument = 'guitar'
  end
end

我们没有将参数更改为初始化,但我们扩展了行为。

答案 1 :(得分:0)

这是扩展课程的格式。

问题在于,您调用的Musician初始化程序的属性多于它接受的属性。

您获得的错误消息明确说明了这一点。在报告或寻求有关错误的帮助时,应该共享您收到的错误消息,以便我们不必猜测或运行您的程序。

你至少有选择:

  • Musician initialize一个initialize,其中包含所有参数,抓取乐器并通过其余参数。
  • 使用Rails'基于哈希的{{1}}(或自己滚动,但是用铁栏标记它)。