ふと思いついた。醤油でオブジェクト指向を解説したくなった。
カバーしていること
クラスの継承とダックタイピング
# 全ての醤油の神
class 醤油
attr_reader :saltiness, :sweetness, :thickness
def initialize(attr)
@saltiness = attr[:saltiness] || default_saltiness
@sweetness = attr[:sweetness] || default_sweetness
@thickness = attr[:thickness] || default_thickness
end
def default_saltiness
raise "小クラスで定義してくださいまし"
end
def default_sweetness
raise "小クラスで定義してくださいまし"
end
def default_thickness
raise "小クラスで定義してくださいまし"
end
def describe_saltiness
raise "小クラスで定義してくださいまし"
end
def describe_sweetness
raise "小クラスで定義してくださいまし"
end
def describe_thickness
raise "小クラスで定義してくださいまし"
end
end
class キッコーマンの普通の醤油 < 醤油
def describe_saltiness
"すげーしょっぱい"
end
def describe_sweetness
"全然甘くない"
end
def describe_thickness
"めっちゃさらさら"
end
private
def default_saltiness
100
end
def default_sweetness
10
end
def default_thickness
5
end
end
class キッコーマンの減塩の醤油 < 醤油
def describe_saltiness
"まぁまぁしょっぱい"
end
def describe_sweetness
"全然甘くない"
end
def describe_thickness
"めっちゃさらさら"
end
private
def default_saltiness
70
end
def default_sweetness
20
end
def default_thickness
10
end
end
class どこかの甘い醤油(多分九州とかで愛用されてる系の醤油) < 醤油
def describe_saltiness
"全然しょっぱくない"
end
def describe_sweetness
"めっちゃ甘い"
end
def describe_thickness
"けっこうトロトロ"
end
private
def default_saltiness
10
end
def default_sweetness
60
end
def default_thickness
30
end
end
普通の醤油 = キッコーマンの普通の醤油.new
減塩の醤油 = キッコーマンの減塩の醤油.new
甘い醤油 = どこかの甘い醤油(多分九州とかで愛用されてる系の醤油).new
普通の醤油.describe_saltiness
# => "すげーしょっぱい"
普通の醤油.describe_sweetness
# => "全然甘くない"
普通の醤油.describe_thickness
# => "めっちゃさらさら"
減塩の醤油.describe_saltiness
# => "まぁまぁしょっぱい"
減塩の醤油.describe_sweetness
# => "全然甘くない"
減塩の醤油.describe_thickness
# => "めっちゃさらさら"
甘い醤油.describe_saltiness
# => "全然しょっぱくない"
甘い醤油.describe_sweetness
# => "めっちゃ甘い"
甘い醤油.describe_thickness
# => "けっこうトロトロ"