サブクラスにだけメソッドのオーバーライドを禁止させるには

2005-11-17のコメント欄にも書いたんだけど、こちらにも書いておきます。

class C
  def self.method_added(name)
    if instance_methods(true).member?(name.to_s) and self != C
      raise "Can not override the method `#{name}''."
    end
  end

  def foo
  end
end

class D < C
  def foo
  end
end

多分こんな感じないかなあ。self != Cというのが生々しくてやや気になる。