web-dev-qa-db-fra.com

Constructeur d'appel parent dans ruby

Comment puis-je appeler le constructeur de parents?

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

Merci.

28
Stan Kurilin

Tout d'abord, votre méthode devrait être initialize, pas initialization. Ensuite, vous pouvez utiliser super pour appeler la méthode de la classe mère. En ce qui concerne l'appelant C 's initialisateur dans A, pour plus de clarté, je vous recommanderais de fractionnement des trucs d'initialisation dans une fonction différente, appelez simplement cette fonction directement. Il est facile à mettre en œuvre et plus clair.

25
Peter

Utilisez la méthode super! Ruby n'a pas de héritage multiple cependant.

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>
28
maček

Ce code ci-dessous imprimera:

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