Вызвать родительский конструктор в рубине
Как я могу вызвать конструктор родителей?
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
Спасибо.
Ответы
Ответ 1
Во-первых, ваш метод должен быть initialize
, а не initialization
. Затем вы можете использовать super
для вызова метода родительского класса. Что касается вызова C
initializer в A
, для ясности я бы рекомендовал разделить материал инициализации на другую функцию, а затем просто вызвать эту функцию напрямую. Он прост в реализации и более ясный.
Ответ 2
В Ruby нет конструкторов, поэтому их невозможно назвать, родительским или иным. Однако у Ruby есть методы, и для вызова родительского метода с тем же именем, что и текущий исполняемый метод, вы можете использовать ключевое слово super
. [Примечание: super
без аргументов - это ярлык для передачи тех же аргументов, которые были переданы в текущий исполняемый метод. Если вы действительно хотите передать никакие аргументы, вы должны сделать это явно: super()
.]
Ответ 3
Используйте метод 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>
Ответ 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