rubyで遊ぼう 継承とミックスイン

サブクラスを作成する場合は、「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です。

なるほどね~。