类和它的父类是否可以包含同名的成员变量?

时间:2012-05-15 03:44:31

标签: ruby inheritance

我做了以下示例来说明。如果我在nameSong课程中使用KarokeSong,则会收到错误。

class Song
  def initialize(name, artist, duration)
    @name = name
    @artist = artist
    @duration = duration
  end

  def to_s
    "Song: #{@name}--#{@artist} (#{@duration})"
  end
end

class KarokeSong < Song
  def initalize(name, kname, artist, duration, lyrics)
    super(name, artist, duration)
    @name = kname
    @lyrics = lyrics
  end

  def to_s
    "KS: #{@name}--#{@artist} (#{@duration}) [#{@lyrics}] **#{@name}**"
  end
end

songA = Song.new("Bicyclops", "Fleck", 260)
puts songA.to_s

songB = KarokeSong.new("John", "Casey", "The Band", 400, "And now, the...")
puts songB.to_s

以下是我在尝试运行该文件时收到的错误。

stanley@ubuntu:~/Github/webdev_class/ruby$ ruby inheritance.rb
Song: Bicyclops--Fleck (260)
inheritance.rb:28:in `initialize': wrong number of arguments(5 for 3) (ArgumentError)
    from inheritance.rb:28:in `new'
    from inheritance.rb:28:in `<main>'

如果存在继承关系,我猜测不允许使用名称name两次。我不确定它是否与Ruby不支持多继承或V指针的事实有关。提前感谢您对正在发生的事情的建议。

2 个答案:

答案 0 :(得分:1)

我认为问题在于卡拉OK松不是继承宋。

将KaraokeSong班级定义更改为class KaraokeSong < Song

答案 1 :(得分:0)

作为标题中问题的答案:实例变量绑定到对象,而不绑定到类。 @name将始终引用给定对象中的相同变量,无论访问它的方法属于哪个类。

super name     # assigns name to @name
@name = kname  # overwrites name with kname