抽象クラスとモジュール

Ruby のモジュールはインスタンスが生成されないことを約束するという意味では抽象クラスです。一方、Java の抽象クラスというのは、インスタンスが生成されないことを約束する以外に、そのサブクラスに対して自身が持つ抽象メソッドの実装を強制させる役割を果たすことが多いです。

では Ruby のモジュールに、そのモジュールを include したクラスで「このメソッド実装しる」と強制させるメカニズムはあるのでしょうか、ということに興味を持ちました。

そういえば、Enumerable モジュールは Mixin 用のモジュールですが、include した側が each メソッドを持っていることを仮定したモジュールです。もし Ruby に、サブクラスあるいは Mixin したモジュールにメソッドの実行を強制できるメカニズムがあるとしたら、Enumerable では当然それを使いたくなるところです。

つまり、メソッド実装強制メカニズムがあるなら

#!/usr/local/bin/ruby

class Foo
  include Enumerable
end

Foo.new.class.each do |foo|
  foo.class.display
end

というのは(Foo に each を実装せずにモジュールを Mixin してるので) 実行時エラーではなく、コンパイルエラー(?) になるはず、ということです。

しかし、このコードは実行時エラーでした。ということで、Ruby には Java の抽象メソッドのようなメカニズムはないのだろうと思いました。