0

説明するために次の例を作成しました。とクラスのname両方で使用すると、エラーが発生します。SongKarokeSong

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継承関係がある場合、名前を2回使用することは許可されていないと思います。Ruby が多重継承または V ポインターをサポートしていないという事実と関係があるかどうかはわかりません。何が起こっているかについての提案を前もってありがとう。

4

2 に答える 2

1

問題は、KaraokeSong が Song を継承していないことだと思います。

KaraokeSong クラスの定義を次のように変更します。class KaraokeSong < Song

于 2012-05-15T03:47:17.800 に答える
0

タイトルの質問への回答として:インスタンス変数はクラスではなくオブジェクトにバインドされます。@nameアクセスしたメソッドがどのクラスに属しているかに関係なく、特定のオブジェクト内の同じ変数を常に参照します。

super name     # assigns name to @name
@name = kname  # overwrites name with kname
于 2012-05-15T12:49:44.073 に答える