Friday, September 26, 2008

Rubyのクラス-オブジェクトはやっぱり複雑だ

だのでもう一度整理
  • クラスにはメソッドを定義することができる。
  • メソッドには、自身のためのselfメソッドとインスタンスのためのInstanceメソッドがある。
  • クラスはインスタンスを生成でき、そのインスタンスはそのクラスに定義されたInstanceメソッドを自身のためのメソッドとして使える。
  • オブジェクトにおけるselfメソッドはInstanceメソッドであり、クラスにおけるselfメソッドはクラスメソッドである。
  • クラス継承は、サブクラスにおいてスーパークラスに定義されたselfメソッドとInstanceメソッドを、自分に定義されたメソッドとして継承すること。
  • すべてのクラスの子孫クラスはObjectクラスであり、従ってObjectクラスに定義されたselfメソッドとInstanceメソッドは、そのまますべてのサブクラスで定義されたものになる。
  • すべてのクラスはClassクラスのインスタンスだから、Classクラスに定義されているInstanceメソッドはすべてのクラスのクラスメソッドになる。
  • ClassクラスはObjectクラスとModuleクラスを継承しているから、それらに定義されているselfメソッドとInstanceメソッドは、Classクラスに定義されたものになる。従って、ObjectクラスとModuleクラスに定義されているInstanceメソッドは、すべてのクラスのクラスメソッドになる。
  • すべてのモジュールは、Moduleクラスのインスタンスである。よってModuleクラスに定義されているInstanceメソッドは、すべてのモジュールのモジュールメソッドになる。
  • モジュールのincludeは、そこに定義されたInstanceメソッドを、include先クラスのInstanceメソッドとして継承すること。この場合モジュールに定義されたselfメソッド(モジュールメソッド)は継承されない。
  • ObjectクラスはKernelモジュールをincludeしている。従って、Kernelモジュールに定義されたInstanceメソッドは、Objectクラスに定義されたものになる。

No comments: