どうすれば親コンストラクタを呼び出すことができますか?
module C
attr_accessor :c, :cc
def initialization c, cc
@c, @cc = c, cc
end
end
class B
attr_accessor :b, :bb
def initialization b, bb
@b, @bb = b, bb
end
end
class A < B
include C
attr_accessor :a, :aa
def initialization (a, b, c, aa, bb, cc)
#call B::initialization - ?
#call C::initialization - ?
@a, @aa = a, aa
end
end
ありがとう。
まず、メソッドはinitialize
ではなくinitialization
にする必要があります。次に、super
を使用して親クラスのメソッドを呼び出すことができます。 C
でのA
のイニシャライザの呼び出しについては、明確にするために、初期化要素を別の関数に分割して、その関数を直接呼び出すことをお勧めします。実装は簡単で、より明確です。
Rubyにはコンストラクターがないため、それらを親などから呼び出すことは明らかに不可能です。 Ruby doesにはメソッドがありますが、現在実行中のメソッドと同じ名前で親のメソッドを呼び出すには、super
キーワードを使用できます。[注意:引数なしのsuper
は、現在実行中のメソッドに渡されたものと同じ引数を渡すためのショートカットです。実際にno引数を渡したい場合は、明示的に渡す必要があります:super()
。]
super
メソッドを使用してください! Rubyには多重継承はありませんが。
class B
attr_accessor :b, :bb
def initialize(b, bb)
@b, @bb = b, bb
end
end
module C
end
class A < B
include C # <= if C was a class, you'd get: TypeError: wrong argument type Class (expected Module)
attr_accessor :a, :aa
def initialize(a,b,aa,bb)
@a, @aa = a, aa
super(b, bb) # <= calls B#initialize
end
end
a = A.new(1,2,3,4)
puts a.inspect # => #<A:0x42d6d8 @aa=3, @a=1, @b=2, @bb=4>
以下のこのコードは印刷されます:
A.proc1 B.proc1 C.proc1
module A
def proc1
puts "A.proc1"
super
end
end
class B
def proc1
puts "B.proc1"
end
end
class C < B
include A
def proc1
super
puts "C.proc1"
end
end
C.new.proc1