Подтвердить что ты не робот

Вызвать родительский конструктор в рубине

Как я могу вызвать конструктор родителей?

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

Спасибо.

4b9b3361

Ответ 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