Rubyは純粋なオブジェクト指向言語であり、第4章「すべてがオブジェクト」で学んだように、数値や文字列さえもオブジェクトです。この章では、それらのオブジェクトの「設計図」であるクラスを定義する方法について学びます。
他のオブジェクト指向言語(Java, Python, C#など)の経験があれば、概念は馴染み深いはずです。Ruby特有の構文(@やattr_*など)に注目してください。
Rubyでは、classキーワードを使ってクラスを定義します。クラス名は慣習として大文字で始めます(例: MyClass)。
newメソッドが呼ばれたときに実行される特別なメソッドが initialize です。これは他の言語におけるコンストラクタに相当し、インスタンスの初期化処理を行います。
ruby user.rb@で始まる変数(例: @name)はインスタンス変数です。
initializeや他のインスタンスメソッド内で定義・参照されます。defで定義されたメソッド(initializeを除く)がインスタンスメソッドです。これらはインスタンスの「振る舞い」を定義し、そのインスタンスのインスタンス変数(@var)にアクセスできます。
ruby user_greet.rb前述の通り、@nameのようなインスタンス変数は外部から直接参照・変更できません。
ruby access_error.rb外部からアクセスさせるためには、アクセサメソッド(ゲッターとセッター)を定義する必要があります。
JavaやC#のように、ゲッターとセッターを明示的に書くこともできます。
ruby manual_accessor.rbRubyでは、上記のような定型的なアクセサメソッドを自動で定義するための便利な「マクロ」が用意されています。これらはクラス定義のトップレベルで使います。
attr_reader :var : ゲッター(読み取り専用)を定義します。attr_writer :var : セッター(書き込み専用)を定義します。attr_accessor :var : ゲッターとセッターの両方を定義します。引数にはインスタンス変数名の@を除いたシンボル(:から始まる名前)を渡します。
ruby auto_accessor.rb@@で始まる変数(例: @@count)はクラス変数です。
インスタンスではなく、クラス自体から呼び出すメソッドです。def self.メソッド名 のように self. をつけて定義します。
User.new の new も、実はクラスメソッドの一種です。@var) にはアクセスできません(インスタンスが存在しないため)。@@var) にはアクセスできます。ruby counter.rbRubyは単一継承をサポートしています。< 記号を使って親クラス(スーパークラス)を指定します。
子クラス(サブクラス)は、親クラスのメソッドや変数を引き継ぎます。
子クラスで親クラスと同じ名前のメソッドを定義(オーバーライド)した際、superキーワードを使うと、親クラスの同名メソッドを呼び出すことができます。
これは特に initialize メソッドで、親クラスの初期化処理を呼び出すために必須となります。
ruby vehicle.rbsuper は引数を省略すると、現在のメソッドが受け取った引数をそのまま親メソッドに渡します。super() のように () をつけると、引数なしで親メソッドを呼び出します。
class キーワードで定義し、インスタンスは .new で生成します。
initialize はインスタンス生成時に呼ばれるコンストラクタです。@ で始まり、インスタンスごとに独立し、デフォルトでプライベートです。attr_reader, attr_writer, attr_accessor は、インスタンス変数へのアクセサ(ゲッター/セッター)を自動定義するマクロです。@@ で始まり、クラスと全インスタンスで共有されます。def self.メソッド名 で定義し、クラス自体から呼び出します。< で行い、super で親クラスの同名メソッドを呼び出します。以下の仕様を持つ Book クラスを作成してください。
initialize で title(タイトル)と author(著者)を受け取る。title と author は、インスタンス変数(@title, @author)に格納する。title と author は、どちらも外部から読み取り可能(書き換えは不可)にする。info というインスタンスメソッドを持ち、"タイトル: [title], 著者: [author]" という形式の文字列を返す。ruby practice7_1.rb問題1で作成した Book クラスを継承して、以下の仕様を持つ EBook(電子書籍)クラスを作成してください。
initialize で title, author, file_size(ファイルサイズ, 例: "10MB")を受け取る。title と author の初期化は、Book クラスの initialize を利用する (super を使う)。file_size は外部から読み取り可能にする。info メソッドをオーバーライドし、"タイトル: [title], 著者: [author] (ファイルサイズ: [file_size])" という形式の文字列を返す。
info メソッドの結果を super で利用すると効率的です。ruby practice7_2.rb