7-6-3 クラスを継承する書き方や動作を確認しよう

クラスを継承する書き方

クラスを継承するには、クラス定義の宣言でclass 継承先クラス < 継承元クラスのように記述します。

継承元クラスは継承先クラスからみて親クラスと言えます。逆に、継承先クラスは継承元クラスからみて子クラスと言えます。

前ページ「7-6-2 税込み額計算用クラスを継承を使って書き換えよう」の例のうち、class TaxCalculator < TaxCalculateBaseという定義では、TaxCalculateBaseTaxCalculatorのスーパークラスであるとも言えます。

このようにクラスを継承することで、子クラスのインスタンスから、親クラスのメソッドを呼ぶことができるようになります。

前ページ「7-6-2 税込み額計算用クラスを継承を使って書き換えよう」の例では、TaxCalculatorクラスのインスタンスcalculatorから、親クラスであるTaxCalculateBaseクラスのattr_accessor :priceで定義されたpriceprice=メソッドを使うことができる様子を確認しました。

その他にも、TaxCalculateBaseクラスに定義されたtaxtax_includedメソッドも使えます。

さらに、インスタンスを生成するnewメソッドが呼び出された際に自動的に呼ばれるinitializeメソッドもまた、親クラスであるTaxCalculateBaseクラスに定義されたものが呼び出されます。

なお、クラスの継承は何度でも定義することができます。

前ページ「7-6-2 税込み額計算用クラスを継承を使って書き換えよう」の例では、TaxCalculateBaseクラスを継承したTaxCalculateFomatterクラスを定義し、更にTaxCalculateFomatterクラスを継承したTaxCalculatorクラスを定義しています。

privateメソッドの動作

親クラスで定義されたprivateメソッドは、子クラスでも同様の動作となります。つまり、子クラスのインスタンスから親クラスで定義されたprivateメソッドを呼び出そうとすると、前ページ「7-6-2 税込み額計算用クラスを継承を使って書き換えよう」の例の通りエラーが発生します。

また、親クラスに定義されたprivateメソッドは、子クラスからでも呼び出すことは可能です。

前ページ「7-6-2 税込み額計算用クラスを継承を使って書き換えよう」の例では、TaxCalculatorクラスのto_arrayto_hashメソッドから親クラスのTaxCalculateBaseクラスのprivateメソッドであるtaxtax_includedメソッドを呼び出しています。

継承元の親クラスのメソッドを上書きする

親クラスにあるメソッドを、子クラスに同じ名前のメソッドを定義することで処理を上書きすることもできます。

前ページ「7-6-2 税込み額計算用クラスを継承を使って書き換えよう」の例では、TaxCalculateFomatterクラスに元々定義されているformatメソッドを、子クラスであるTaxCalculatorクラスで上書きしています。

親クラスのメソッドの処理を全く別物にする場合は、子クラスに同名メソッドを定義しますが、親クラスの処理を丸ごと呼び出すこともできます。

親クラスの処理を呼び出すには、同名メソッド内でsuperと記述します。

superと記述するとクラスの継承関係を順にたどって同名のメソッドを探し、継承関係から一番近い同名のメソッドを呼び出します。

なお、superと記述すると、メソッドの引数も全て含めて親クラスのメソッドを呼び出します。

前ページ「7-6-2 税込み額計算用クラスを継承を使って書き換えよう」の例では、TaxCalculatorクラスのインスタンスであるcalculatorからformatメソッドを引数format_type: :arrayで呼び出していますが、実行結果が配列であることからこの引数が有効になっていることが分かります。

これはsuperによって親クラスのformatメソッドが引数format_type: :arrayで呼び出されているからです。

三項演算子

前ページ「7-6-2 税込み額計算用クラスを継承を使って書き換えよう」の例で、TaxCalculateFomatterクラスのformatメソッドでformat_type == :hash ? to_hash : to_arrayという記述があります。

これは、三項演算子と呼ばれる条件式の一種で、条件式 ? 条件式がtrueの場合の値 : 条件式がfalseの場合の値という意味です。前ページ「7-6-2 税込み額計算用クラスを継承を使って書き換えよう」の例では、「変数format_type:hashならto_hashメソッドを呼ぶ、format_type:hash以外ならto_arrayメソッドを呼ぶ」という処理になります。この条件式は以下のように記述する短縮形と言えます。

# if〜else文を使う場合
if format_type == :hash
  to_hash
else
  to_array
end

# 三項演算子
format_type == :hash ? to_hash : to_array

クラスの継承の書き方や動作のまとめ

  • クラスを継承すると、子クラスのインスタンスから親クラスのメソッドを呼び出せる
  • クラスを継承してもprivateメソッドの動作は変わらず、クラス内部からのみ呼び出せる
  • 親クラスのメソッドを子クラスで上書きできる
  • 子クラスのメソッドでsuperと記述すると、親クラスのメソッドを呼び出せる