Rubyではクラスが継承されると親クラスのClass#inherited
というメソッドが呼ばれる。
class Foo
def self.inherited(subclass)
puts "#{self} is inherited by #{subclass}"
end
end
class Bar < Foo
end
Baz = Class.new(Foo)
Foo is inherited by Bar
Foo is inherited by #<Class:0x007fdd11969330>
Class.new
でサブクラスを生成すると無名のクラスが生成されて、最初に定数に代入されたタイミングでクラスの名前が設定されるというキモい仕様があるので、Class.new(Foo)
のタイミングでは名前が出ていない。
Class#inherited
が呼ばれるタイミングは「クラス定義文の実行直前」とのことなので、上記のBarクラスにあれこれメソッドとか定義してあっても、inheritedが呼ばれた段階ではまだ記述したメソッドが存在しないことに注意。
ちょうど上記のように単に継承しただけの状態と同じクラスになっている。
似たようなものにModule#included
やModule#extended
がある。それぞれモジュールがinclude/extendされた時に呼ばれる。
こんな機能を使うことはそうそうないと思うけど、仕事で使ってたとあるライブラリではプラグインを自動的にプラグインマネージャ的なものに登録する仕組みとして使われていた。
0 件のコメント:
コメントを投稿