我做了以下示例来说明。如果我在name
和Song
课程中使用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指针的事实有关。提前感谢您对正在发生的事情的建议。
答案 0 :(得分:1)
我认为问题在于卡拉OK松不是继承宋。
将KaraokeSong班级定义更改为class KaraokeSong < Song
答案 1 :(得分:0)
作为标题中问题的答案:实例变量绑定到对象,而不绑定到类。 @name
将始终引用给定对象中的相同变量,无论访问它的方法属于哪个类。
super name # assigns name to @name
@name = kname # overwrites name with kname