0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ruby initializeメソッドのオーバーライドについて

Posted at

initializeメソッドの動き

スーパークラスとサブクラスでinitializeが定義されていた場合、どのような動きが起こるか確認していきます。

class Parent
    attr_accessor(:name)
    
    def initialize(name)
        @name = name
    end
end

class Child < Parent
    attr_accessor(:grade)
    
    def initialize (grade)
        @grade = grade
    end
end

p Child.new("10")    #=> @grade="10

p Parent.new("Aki")  #=> @name="Aki"

サブクラスに引数を与え、呼び出したとき、スーパークラスを呼び出さず、サブクラスのinitializeメソッドが呼び出されているのがわかります。

これは、通常のメソッドを下位レベルから探していくのと同じ手順です。

サブクラスのinitializeにsuperを設定

initializeが重なっていた場合にスーパークラスのinitializeにsuperを設定することで、初期値を変更することで細かく制御することができる。

ただし、superの呼び出し方で反応が変わるので注意が必要です。

class Parent
    attr_accessor(:name)
    
    def initialize(name)
        @name = name
    end
end

class Child < Parent
    attr_accessor(:grade)
    
    def initialize (grade)
        super("foo") #=> @name="foo"
        super        #=> @name="10"
        super "foo"  #=> @name="foo"
        super()      #=> ArgumentError
        @grade = grade
    end
end

p Child.new("10")  

super("foo")super "foo" では、初期値を設定しているため@name="foo"という値が返ります。

superのみで呼び出す場合は、初期値の呼び出しがないため、スーパークラスのinitializeメソッドが呼び出され、@name="10"が設定されます。

super()ではerrorが発生します。
構文としては間違っていませんが、使用する場面としてはオーバーライドされるメソッドに引数を渡さずにsuperを使用したい時に限ります。(この場合、"10"を引数として渡したくない)

この場合はsuperに()をつけて明示的に示す必要があります。ただし、スーパークラスのメソッドの引数は定義すると使えないようです。

class Parent
    attr_accessor(:name)
    
    def initialize()
        @name = name
    end
end

class Child < Parent
    attr_accessor(:grade)
    
    def initialize (grade)
        super()      #=> @name=nil
        @grade = grade
    end
end

p Child.new("10") 

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?