クラスとインスタンス
オブジェクト指向とクラスは必ずしもセットというわけではありません(例えばJavaScriptはオブジェクト指向の言語ですが、その中核にあるのはクラスではなくプロトタイプチェーンです)が、JavaやC#
、Rubyなどはクラスの概念をベースに設計されたオブジェクト指向言語です。
Rubyにおいてクラスの定義はclass ClassName ... end
で行い、クラスのインスタンスを作成するためにはnewメソッドを呼び出します。
def
はメソッドを定義するための構文で、クラス内で定義したメソッドはそのインスタンスに対して呼び出すことができます。
ところで、前ページでは「"moji"
」はStringクラスのインスタンスでした。newを使っていなかったのにどうやってインスタンスが出来たのでしょう?
これは、「""
」がStringクラスのインスタンスを作成するリテラルだからです。リテラルとは、プログラミング言語の用意した、newしなくても何かのクラスのオブジェクトを作れる記法を指します。 他の例として「[1,2,3]
(Array)」、「{x: 1, y: 2}
(Hash)」などもリテラルです。
継承
既存のクラスを継承させたいとき、class ClassName < ParentClass
という書き方で親クラスを表します。記事内では継承という概念については詳しく触れませんが、もし初めて聞く場合は「親クラスの機能を引き継ぎつつ、新しいクラスを定義する」ことを指すと考えて下さい。
先ほど作成したDogクラスを継承したBeagleクラスを作成し、say
メソッドを定義しています。この中でsuper
メソッドを呼ぶと、その場で親クラスの同名メソッドを実行します。
クラスの継承は便利な機能であり、正しく使えばコードを簡潔にしてくれます。Rubyにはクラスの他にモジュール(module)という機能もありますが、話が入り組んでくるのでこれは回を改めて取り扱うことにします。
オープンクラス
Rubyにとって、クラスはたった一度の定義で固定されるものではありません。プログラマは好きなときにクラスを「オープン」し、機能拡張することができます。
さっきと同じDogという名前でクラス定義を行ってみると、先に定義したsay
も失われることなく、引き続き使えていることがわかります。つまりclass Dog
で新しい定義が上書きされるのではなく、既存のDogクラスに機能を追加することができるのです。
自分で定義したクラスはもちろん、StringやArrayといった標準クラスも自在に拡張できます。このように「言語を使うプログラマを信頼し、大きな(そして場合によっては危険な)力を与える」というのも、Ruby言語仕様の特徴の一つです。
次のページではRubyの特徴の最後の一つ「ブロックとイテレータ」を解説し、学習のための書籍とリンクをご紹介します。