Rubyのinitializeメソッドの継承
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
Rubyでは、サブクラスでinitializeメソッド(C++やJavaでのコンストラクタに相当するメソッド)を定義しなかった場合、スーパークラスのinitializeメソッドが自動的に継承されます。
スポンサーリンク
サブクラスでinitializeメソッドを定義しない場合
class RubySuperClass def initialize(x, y) @x = x @y = y end attr_accessor :x, :y end class RubySubClass < RubySuperClass def display puts(self.x << "、" << self.y) end end o1 = RubySubClass.new('こんにちは', '山田さん') o1.display
実行結果。
こんにちは、山田さん
サブクラスが、自動的にスーパークラスのinitializeメソッドを継承していることを確認できます。
サブクラスでinitializeメソッドを定義した場合
class RubySuperClass def initialize(x, y) @x = x @y = y end attr_accessor :x, :y end class RubySubClass < RubySuperClass def initialize(x, y) end def display puts(self.x << "、" << self.y) end end o1 = RubySubClass.new('こんにちは', '山田さん') o1.display
def initialize(x, y) をサブクラスで定義してはいますが、中身は空。
この場合、自動的にスーパークラスのinitializeメソッドを継承することはなく、displayメソッドでエラーが発生します。
def initialize(x, y) を定義する場合、スーパークラスのinitializeメソッドを呼び出すには、superで明示的に呼び出す必要がある。
superで明示的にスーパークラスのinitializeメソッドを呼び出す
class RubySuperClass def initialize(x, y) @x = x @y = y end attr_accessor :x, :y end class RubySubClass < RubySuperClass def initialize(x, y) super end def display puts(self.x << "、" << self.y) end end o1 = RubySubClass.new('こんにちは', '山田さん') o1.display
実行結果。
こんにちは、山田さん
initializeメソッドをサブクラスでオーバーライドした場合、superと書くと、引数をそのままスーパークラスのinitializeメソッドに渡します。
ここをsuper()と括弧付きで書くと、引数を渡さずにスーパークラスのinitializeメソッドを呼び出し、この例の場合では、スーパークラスのinitializeメソッドはx, yの引数をとりますので、エラーとなります。
スポンサーリンク
>> 次の記事 : オブジェクトのコピーを作る
- - 関連記事 -
- 特異クラスによるクラスメソッド定義・class << self ~ end
- モジュールの使い方
- クラス定義でメソッドへのアクセス制限・public, private, protected
- クラス継承
- クラス拡張
- クラス変数・クラスメソッド
- アクセスメソッド(アクセサ)をattr_reader, attr_writer, attr_accessorで定義
- アクセスメソッド(アクセサ)
- Rubyのクラス定義・initialize(コンストラクタ)
- スーパークラスとサブクラス・クラス継承
- classメソッド・オブジェクトが属するクラスを調べる
- private, protected アクセス指定の違い
- オブジェクトのコピーを作る
スポンサーリンク