2010-04-26 20 views
24

Wie kann ich Eltern Konstruktor aufrufen?Aufruf übergeordnete Konstruktor in Ruby

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 

Danke.

+0

Ist es für ein Modul idiomatisch, eine Initialisierungsmethode zu verwenden? –

+1

@Andrew Grimm, wahrscheinlich, nein. Du hast recht. Ich begann gerade Rubin im April 2010;) –

Antwort

23

Zunächst sollten Sie Ihre Methode initialize sein, nicht initialization. Dann können Sie super verwenden, um die Elternklassenmethode aufzurufen. Um den Initializer A von C anzurufen, würde ich aus Gründen der Übersichtlichkeit empfehlen, die Initialisierung in eine andere Funktion zu teilen und diese Funktion dann direkt aufzurufen. Es ist einfach zu implementieren und klarer.

+4

Ich weiß, Sie haben die Antwort richtig, indem Sie sagen, dass Sie super verwenden, aber für jemanden, der super neu zu Ruby ist, wusste ich einfach nicht, bis ich niedrigere Beispiele sah. – WojonsTech

+1

Codebeispiele sind immer hilfreicher. – 0112

23

Verwenden Sie die super Methode! Ruby hat jedoch keine mehrfache Vererbung.

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

Ruby hat keine Konstruktoren, daher ist es offensichtlich nicht möglich, sie zu nennen, Eltern oder andere. Ruby hat jedoch Methoden, und um die Methode des übergeordneten Elements mit demselben Namen wie die derzeit ausgeführte Methode aufzurufen, können Sie das Schlüsselwort super verwenden. [Hinweis: super ohne Argumente ist eine Verknüpfung für die Übergabe der gleichen Argumente, die in die aktuell ausgeführte Methode übergeben wurden. Wenn Sie tatsächlich keine Argumente zu übergeben wollen, müssen Sie dies explizit tun: super()]

+1

@ Jörg, +1. Danke für die Erwähnung der Abkürzung. Overriding-Methoden wurden gerade so viel eleganter :) –

+0

In Bezug auf "die gleichen Argumente übergeben": Wenn Sie "a = 42" vor der Verwendung von "Super" ohne Klammern verwenden, wird es das neue Objekt verwenden, auf das sich 'a' bezieht nicht der alte. –

+3

Was meinen Sie mit "Rubin hat keine Konstruktoren"? – Leopd

7

Dieser Code unten gedruckt wird.

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 
+0

Yeap. Aha. Vielen Dank. –