突込みが何個かあったのでそれも踏まえてやってみた。
モトネタ
http://blogs.wankuma.com/episteme/archive/2007/11/08/106927.aspx
http://blogs.wankuma.com/kazuki/archive/2007/11/08/107032.aspx
課題
- Animalがnewできるじゃん?
というわけでさくっと片付けよう。
main.rb
require 'animal.rb'
animal = nil
animal = Dog.new
animal.sound
animal.count = 3
animal.sound
animal = Cat.new
animal.sound
animal.rb
module Animal
attr_accessor :count
def initialize
self.count = 1
end
def sound
self.count.times { cry }
puts
end
end
class Dog
include Animal
def cry
print "わん"
end
end
class Cat
include Animal
def cry
print "にゃー"
end
end
こんなもん???
これで、Animal.newもできない!!!
因みにRubyみたいなDuck Typing出来る言語だと、鳴ける?鳴けない?はこういう感じで回避かなぁ?
# 魅惑のナメクジさん
class Slug
include Animal
def eat
puts "泥をむしゃむしゃと食べます"
end
end
s = Slug.new
s.sound if s.respond_to? :cry # 鳴けたら声聞かせて
s.eat if s.respond_to? :eat # 食べれたら食べて
respond_to?メソッドで、応答するかどうかを聞けるので確認してから伺えばよろしい。
突然変異で鳴けるナメクジもOK
s = Slug.new
class << s
def cry
print "ぬめ"
end
end
s.count = 3
s.sound
これを実行すると「ぬめぬめぬめ」と表示される。