вызовите родительский конструктор в ruby - PullRequest
26 голосов
/ 26 апреля 2010

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

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

Спасибо.

Ответы [ 4 ]

37 голосов
/ 26 апреля 2010

В Ruby нет конструкторов, поэтому, очевидно, невозможно вызвать их, родительские или иные. Однако в Ruby есть методы, и для вызова метода родителя с тем же именем, что и текущий выполняемый метод, вы можете использовать ключевое слово super. [Примечание: super без аргументов - это ярлык для передачи тех же аргументов, которые были переданы в текущий выполняемый метод. Если вы действительно хотите передать нет аргументов, вы должны сделать это явно: super().]

28 голосов
/ 26 апреля 2010

Используйте метод 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>
24 голосов
/ 26 апреля 2010

Во-первых, ваш метод должен быть initialize, а не initialization. Затем вы можете использовать super для вызова метода родительского класса. Что касается вызова инициализатора C в A, для ясности, я бы рекомендовал разделить компоненты инициализации в другую функцию, а затем просто вызвать эту функцию напрямую. Это легко реализовать и понятнее.

7 голосов
/ 16 апреля 2011

Этот код ниже напечатает:

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
...