サブクラスを作成する場合は、「class サブクラス名 < 親クラス名」とします。また、superは親クラスの同名のメソッドを呼び出すものです。 早速見てみましょう。
class Robot def initialize(name) @name = name @x = @y = 0 end def move(x, y) @x += x; @y += y end def to_s “#{@name}: #{@x},#{@y}” end end class FlyingRobot < Robot def initialize(name) super @z = 0 end def move(x, y, z) super(x, y) @z += z end def to_s super + ",#{@z}" end end robo1 = Robot.new("ロボ1号") puts robo1 robo1.move(10, 5) puts robo1 robo2 = FlyingRobot.new("飛行ロボ") puts robo2 robo2.move(5, 5, 30) puts robo2
C:\rails>ruby test.rb ロボ1号: 0,0 ロボ1号: 10,5 飛行ロボ: 0,0,0 飛行ロボ: 5,5,30
手間を省略できますね♪
その他に、モジュールというものがあります。クラスのように、メソッドを記述します。
クラスの中にモジュールを取り込むことをミックスインといいます。
しかし、モジュールは親クラスにはなれず、親クラスを持つこともできませんが、ミックスインはできます。rubyは単一継承のため、複数の親クラスを持つことはできませんが、複数のモジュールを取り込むことができます。
module Radar def distance_to(other) Math.sqrt((self.x - other.x) **2 + (self.y - other.y) ** 2) end end class Robot include Radar attr_accessor :name, :x, :y def initialize(name) @name = name @x = @y = 0 end def move(x, y) @x += x; @y += y end end robo1 = Robot.new("ロボ1号") robo2 = Robot.new("ロボ2号") robo2.move(12, 35) puts "距離は #{robo1.distance_to(robo2)}です。"
C:\rails>ruby test.rb 距離は 37.0です。
なるほどね~。