SyuchiNikuRingの備忘録

お勉強したことをまとめておく場所。中の人の理解や感覚で書いているから不正確なことも多いかも。

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