[RUBY] super ruft nicht nur die Methoden der übergeordneten Klasse auf

Einführung

Ich studiere für den Erwerb von Rubingold. Ich habe mein Verständnis von Super geändert und wollte es teilen.

Hauptthema

Was für ein Ergebnis wird zunächst ausgegeben, wenn der folgende Code ausgeführt wird?


module M
  def foo
    super
    puts "M#foo"
  end
end

class C2
  def foo
    puts "C2#foo"
  end
end

class C < C2
  def foo
    super
    puts "C#foo"
  end
  include M
end

C.new.foo

Option 1

C2#foo C#foo

Option 2

C2#foo M#foo C#foo

Option 3

Fehler wird angezeigt

Ich dachte immer, es wäre 1. Die richtige Antwort lautet übrigens "Option 2" Wenn Sie es richtig verstehen und richtig beantworten, müssen Sie nicht mehr suchen. Vielen Dank für das bisherige Anschauen.

Wie habe ich zuerst Option 1 gewählt?

"C-Klasse-Foo-Methode, hmm hmm" "Oh, super? Du musst dir nur die Elternklasse ansehen." "Ich verstehe, die Antwort ist 1!"

Es ist so. Ich dachte, es würde nicht aufgerufen werden, wenn ich das Modul einbinde.

Lass uns etwas über die Superklasse lernen. Zunächst eine kurze Beschreibung von Super, beschrieben im Referenzhandbuch.

super ruft die Methode auf, die die aktuelle Methode überschreibt

Ich verstehe, es scheint keine Superklassenmethode aufzurufen. Verwenden wir nun die Ahnenmethode.

##Kürzung

class C < C2
  def foo
    super
    puts "C#foo"
  end
  include M
  self.ancestors #=> [C, M, C2, Object, Kernel, BasicObject]
end

C.new.foo

Vorfahren ist eine Methode, die auf einfache Weise die Suchreihenfolge von Methoden anzeigt. Wenn beispielsweise die foo-Methode ausgeführt wird, wird nach der C foo-Methode gesucht, und wenn nicht, wird nach der M foo-Methode gesucht.

Schauen wir uns nun den fraglichen Code noch einmal an.

module M
  def foo
    super #Siehe foo in C2
    puts "M#foo"
  end
end

class C2
  def foo
    puts "C2#foo"
  end
end

class C < C2
  def foo
    super #Siehe Ms Foo
    puts "C#foo"
  end
  include M
  self.ancestors #=> [C, M, C2, Object, Kernel, BasicObject]
end

C.new.foo
#=> C2#foo
#=> M#foo
#=> C#foo

Fazit

abschließend

Wenn Sie für Qualifikationen studieren, werden Sie Ihr Verständnis vertiefen. Wenn Sie also wenig praktische Erfahrung haben, können Sie versuchen, zu studieren.

Recommended Posts

super ruft nicht nur die Methoden der übergeordneten Klasse auf
Verschiedene Methoden der String-Klasse
Benennen und rufen Sie in Ruby übergeordnete Klassenmethoden explizit auf
Wie man einige Methoden der zu testenden Klasse verspottet
Rufen Sie die Super-Methode in Java auf
[Ruby] Zusammenfassung der Klassendefinitionen. Beherrsche die Grundlagen.
Informationen zu next () und nextLine () der Scannerklasse
Erster Touch der Files-Klasse (oder Java 8)