Denken Sie an bless
als Infrastruktur, während new
Teil der (anpassbaren) Schnittstelle ist.
Wenn Sie sich die Implementierung der Klasse Mu
ansehen (die root des Klassensystems),% bless
ruft nqp::create
auf, den Low-Level-Konstruktor, und ruft BUILDALL
auf, wodurch die Vererbungskette durchsucht wird, um die entsprechenden BUILD
(sub-) Methoden aufzurufen initialisiere das Objekt. Der Standardwert new
ruft wiederum bless
auf.
So new
ruft bless
Aufrufe BUILDALL
Aufrufe BUILD
auf. Normalerweise sollten Sie bless
und BUILDALL
alleine lassen und new
und BUILD
für die Anpassung überschreiben. Beachten Sie auch, dass der Name new
nur eine Konvention ist: Es ist eine normale Methode, die nichts Besonderes tut, außer bless
aufzurufen.
Einfach ausgedrückt ist neu ein vollständiger Konstruktor und segnen ist ein minimalistischer Konstruktor.
Um das doco auf bless zu zitieren, ist bless ein ...
Untergeordnete Objektbaumethode als neu. Erstellt ein neues Objekt desselben Typs wie der Aufrufer, verwendet die benannten Argumente zum Initialisieren von Attributen und gibt das erstellte Objekt zurück. Sie können diese Methode beim Schreiben von benutzerdefinierten Konstruktoren verwenden:
%Vor%... während neu ist ein ...
Standardmethode zum Konstruieren (Erstellen + Initialisieren) neuer Objekte einer Klasse. Diese Methode erwartet nur benannte Argumente, die dann verwendet werden, um Attribute mit gleichnamigen Accessoren zu initialisieren. Klassen können ihre eigene neue Methode zum Überschreiben dieses Standards bereitstellen.
New löst einen Objektkonstruktionsmechanismus aus, der in jeder Klasse einer Vererbungshierarchie Untermethoden namens BUILD aufruft, sofern diese existieren. Weitere Informationen finden Sie in der Dokumentation zur Objektkonstruktion .
Sehen Sie sich die Dokumentation zur Objektkonstruktion an, um die vollständige Geschichte zu erhalten, aber das kritische Bit ist;
Mu.new Calls Methode segne auf ihren Aufruf und übergibt alle genannten Argumente. bless erzeugt das neue Objekt und ruft dann die Methode BUILDALL darauf auf. BUILDALL führt alle Unterklassen in umgekehrter Methodenauflösungsreihenfolge durch (d.h. von Mu zu den meisten abgeleiteten Klassen) und prüft in jeder Klasse auf das Vorhandensein einer Methode namens BUILD. Wenn es existiert, wird es aufgerufen, wobei wiederum alle benannten Argumente von der Methode new an es übergeben werden.
In einer früheren Version dieser Antwort habe ich festgestellt, dass segne nicht die Klassenhierarchie durchläuft, die die Submethode BUILD wie oben beschrieben aufruft - das war falsch. .bless macht das Gleiche.
Also, wann benutzt du einen über den anderen? Wenn der Standard .new , der von der Klasse Mu bereitgestellt wird, nicht der gewünschte Konstruktor ist, würden Sie in Ihrer Klasse einen method new
deklarieren, der .bless um das Objekt zu konstruieren, und dann würden Sie fortfahren, Attribute zu initialisieren und jene anderen Aufgaben auszuführen, die der Standard .new nicht tut.
Tags und Links perl6