call-next-method

Im Rumpf von Methoden ist die Funktion call-next-method definiert. Sie erwartet keine Argumente und liefert das Resultat des Aufrufs der nächst generelleren Methode mit den Argumenten des gerade ausgeführten Methodenaufrufs.

Eine Methode mit den Klassen oder Merkmalen C1 C2 ... Cn in ihren spezialisierten Parametern ist genereller als eine andere Methode mit den Klassen oder Merkmalen D1 D2 ... Dn, wenn das erste Ci mit Ci ≠ Di in der Superklassenhierarchie der Klasse des zugehörigen Arguments weiter von der Wurzel der Hierarchie entfernt oder weiter rechts vorkommt als das zugehörige Di.

Angenommen, folgende Klassen, Merkmale und Methoden werden definiert:

> (defclass c1 ())
> (defclass c2 (c1))
> (deftrait d ())
> (defclass c3 (d c2))
> (defmethod m ((o d)) t (concatenate "a" (call-next-method)))
> (defmethod m ((o c2)) t "b")
> (defmethod m ((o c1)) t "c")

und dann wird die generische Funktion m mit einer Instanz der Klasse c3 aufgerufen:

> (m (allocate-instance c3))
"ab"

Es ergibt sich das Resultat "ab", weil die Methode mit dem Spezialisierer d die Speziellste ist und die nächst Generellere die Methode mit dem Spezialisierer c2. Der Spezialisierer d ist am speziellsten, weil er in der Superklassenhierarchie der Klasse des Arguments (c3) am weitesten links und am wenigsten von der Wurzel entfernt auftritt. Es folgen c2 und c1. Würde es eine Methode mit Spezialisierer c3 geben, dann wäre diese die Speziellste und würde zuerst aufgerufen.


Anlage

Superklassenhierarchie der Klasse c3