その他
    ホーム 技術発信 DoRuby rubyで抽象メソッドを表現する
    rubyで抽象メソッドを表現する
     

    rubyで抽象メソッドを表現する

    この記事はアピリッツの技術ブログ「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++を使っていた自分からするとある程度縛りの効いたルールがある方が安心して動けるので、この記事を書くに至ったわけです。
    でもせっかく自由に楽しくがモットーの言語なのにそれを制限するのも変な感じがするので自由さを生かすような設計をしていきたいですね。