Ruby入門season5~継承~
やっほー。久しぶりの更新です。
今回はクラス継承のお話をまとめます。このエントリをもってRubyはいったんおしまい。
とりあえずいってみよー。
継承により親クラスのインスタンス変数とインスタンスメソッドが引き継がれるのでメソッドを踏襲したい場合やマイナーチェンジをしたい場合に使います。
Rubyの継承はこのように書きます。
require ./(継承したいクラス) class (子クラス) < (親クラス) end
実際に書いてみました。
ペットショップのプログラムです。
親クラス、子クラス、実行メソッドの順に並んでいます。コードテストにかけた結果、
Line 8: syntax error, unexpected tSYMBEG, expecting ')'
def initialize(name:, price:, length:)
^
Line 12: syntax error, unexpected kEND, expecting $end
と返されました。うーーーん。
テストに使ったのは、
codepad
です。
詳しくはこちらを。実際にテストにかけた結果が載っています。
http://codepad.org/vFhqPx8D
class Creature attr_accessor :name attr_accessor :price attr_accessor :length def initialize(name:, price:, length:) self.name = name self.price = price self.length = length end def profile return "#{self.name}は#{self.price}円です。全長は#{self.length}mくらいになります。" end end require "./Creature" #creatureクラスを継承 class Fish < Creature attr_accessor :swim_speed def initialize(name:, price:, length:, swim_speed:) #superを用いてCreatureクラスのinitializeメソッドとの共通項をまとめて継承 super(name: name, price: price, length: length) self.swim_speed = swim_speed end #profileを継承&オーバーライド def profile return "#{self.name}は#{self.price}円です。全長は#{self.length}mくらいです。 泳ぐ速さは#{self.swim_speed}km/hくらいです。" end end require "./Creature" #Creatureクラスを継承 class Reptiles < Creature attr_accessor :run_speed def initialize(name:, price:, length:, run_speed:) #superを用いてCreatureクラスのinitializeメソッドとの共通項をまとめて継承 super(name: name, price: price, length: length:) self.run_speed = run_speed end def profile return "#{self.name}は#{self.price}円です。全長は#{self.length}mくらいです。 走る速さは#{self.run_speed}km/hくらいです。" end end #それぞれのクラスを読み込み require "./Fish" require "./Reptiles" fish1 = Fish.new(name:"バショウカジキ", price:750, length:3.3, swim_speed:112) fish2 = Fish.new(name:"錦鯉", price:40000000, length:30, swim_speed:16) reptile1 = Reptiles.new(name:"バシリスク", price:8000, length:0.6, run_speed:3.6) reptile2 = Reptiles.new(name:"ブラックマンバ", price:50000, length:2, run_speed:16) creatures = [fish1, fish2, reptile1, reptile2] number = 1 creatures.each do |creature| puts "No.#{number} #{creature}" number += 1 end puts "どの生き物が気になりますか?" creature_number = gets.chomp.to_i selected_creature = creatures[creature_number][:name] puts "#{selected_creature}ですね。かわいいですよね。おすすめです。"
修正(2018/09/18)**
順番変えるとエラーは一か所のみになりました。
http://codepad.org/Hv9f5I18