この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
rubyについて調べていたら抽象クラス/メソッドをサポートしていないようでした。
ですが抽象メソッドのようなものを簡単に表現できるようなのでそれを紹介したいと思います。
オーバーライドしなきゃエラー!
抽象メソッドはオーバーライドを強制する
のが目的なので、オーバーライドされてなければエラーする形で実装してやれば表現できます。
class GameObject
# GameObjectを継承した描画の実行はこれを呼び出す
def draw
draw_proc
end
# これを子クラスでオーバーライドしないと
# drawから呼ばれてエラーになる
def draw_proc
raise "call abstract !"
end
end
class Circle < GameObject
def draw_proc
puts "丸だよ"
end
end
class Box < GameObject
def draw_box
puts "四角だよ"
end
end
circle = Circle.new
circle.draw
=> 丸だよ
box = Box.new
box.draw
=> RuntimeError: call abstract !
draw_proc
を継承していないBox
クラスから描画メソッドを呼び出したらちゃんとエラーを出してくれました。
おわりに
rubyでプログラミングしていて「これエラーにならないんだ」と思うところが多々ありました。
それもそのはずで、そもそもrubyの設計思想がストレスなくプログラムを楽しめるようにといったものらしいのですが、c++を使っていた自分からするとある程度縛りの効いたルールがある方が安心して動けるので、この記事を書くに至ったわけです。
でもせっかく自由に楽しくがモットーの言語なのにそれを制限するのも変な感じがするので自由さを生かすような設計をしていきたいですね。