Ich habe den Well Grounded Rubyist gelesen und erwähnt, wie eine Klasse die Instanzmethoden ihrer Superklasse erbt, so dass Objekte der Klasse diese Instanzmethoden aufrufen können. Hier ein Beispiel:Verstehen der Ruby-Vererbung
class C
def run_instance_method
puts "This is an instance method."
end
def C.run_class_method
puts "This is a class method."
end
end
class D < C
end
Nach dem, was ich gelesen habe, ist es immer, dass die Klasse D beschrieben worden wäre nur die Instanzmethoden der Klasse C erben (in diesem Fall das C :: run_class_method nicht vererbt werden würde durch D). Doch nach dem obigen Code ausgeführt wird, merke ich, dass:
D.run_class_method # => "This is a class method."
Hier ist meine Vermutung, warum dies geschieht, und lassen Sie es mich wissen, ob dies das richtige Verständnis ist. Wenn es eine Instanz d der Klasse D gibt und Sie versuchen, d.run_instance_method auszuführen, durchsucht dieses Objekt seinen Methoden-Suchpfad und prüft, ob diese Methode in ihrer Singleton-Klasse, ihrer eigenen Klasse oder in ihren Oberklassen definiert ist. Da run_instance_method in Klasse C definiert ist, treten keine Probleme auf und run_instance_method wird aufgerufen. Für das Klassenobjekt D (welches eine Unterklasse von C und Object ist) wird, wenn D.run_class_method aufgerufen wird, erneut der Methoden-Suchpfad für das D-Klassenobjekt überprüft. Wieder wird Ruby es im Klassenobjekt C finden.
Ist diese Argumentation korrekt?
Dank für die Erklärung. Können Sie mich korrigieren, wenn ich mit dieser Erklärung nicht einverstanden bin: Grundsätzlich sind alle Klassenmethoden in ihrer Eigenklasse als Instanzmethoden enthalten. Wenn die Klasse D von ihrer Oberklassenklasse C erbt, erbt die Eigenklasse Klasse D implizit auch die Eigenklasse der Klasse C. Aus diesem Grund kann das Klassenobjekt D .run_class_method aufrufen. Ist das genau? – wmock
Genau! Wenn Ruby einen Methodenaufruf-Ausdruck evaluiert, muss zuerst herausgefunden werden, welche Methode aufgerufen werden muss. Dies nennt man 'Method Lookup': Suchen Sie zunächst nach der Methodendefinition in der Selbstklasse, wenn keine Methode gefunden wird, suchen Sie dann in der Klasseneltern bis zum Kettenstamm. –