Class Precedence List
Die Class Precedence List (CPL) eine Datenstruktur in der Objektorientierten Programmierung, mit deren Hilfe das Laufzeitsystem die Methodenauswahl durchführt. Sie kommt häufig in Programmiersprachen zur Anwendung, die Mehrfachvererbung unterstützen.
Die Notwendigkeit einer CPL ergibt sich daraus, dass bei Mehrfachvererbung mehr als ein Pfad von einer bestimmten Klasse zur Wurzel des Klassenbaumes möglich ist, beziehungsweise zwischen nebengeordneten Klassen nicht von selbst eine Vorrangigkeit gegeben ist.
Mathematisch ist die CPL einer Klasse eine totale Ordnung ihrer Superklassen nach der Vorrangigkeit. Im Rahmen des Methodenaufrufs wird die CPL zusammen mit den Parametern des Methodenaufrufs herangezogen, um eine weitere Struktur, die Liste der sorted applicable methods zu erzeugen. Über diese wird schließlich die Methodenauswahl durchgeführt.
Synthese
[Bearbeiten | Quelltext bearbeiten]Jede Klasse wird mit einer oder mehreren direkten Superklassen definiert. Durch die Reihenfolgen, in der die Superklassen in den Klassendefinitionen benannt werden, ist eine Topologische Ordnung wie folgt gegeben:
Angenommen eine Klasse wird von den direkten Superklassen (in dieser Reihenfolge) abgeleitet. Dann erzeugt die zweistellige Relation
eine totale Ordnung auf der Menge aus und ihren direkten Superklassen. Bildet man die Vereinigung mit
aller direkten /und/ indirekten Superklassen von , so ist diese Relation eine partielle Ordnung der Superklassen.
Es gibt widersprüchliche Fälle, in denen die Vorrangigkeit einer Superklasse vor einer Superklasse bezüglich der abgeleiteten Klasse genauso gefordert ist, wie umgekehrt. In diesem Fall erfolgt eine Fehlermeldung durch den Compiler.
Falls aber konsistent ist, ist jede mit ihr verträgliche topologische Ordnung eine Class Precedence List von für .
Bei einer Programmiersprache ohne Mehrfachvererbung, wie Java, ist Bestimmung der CPL trivial und sie ist identisch mit dem direkten Aufstiegspfad von der Klasse zur Wurzel des Klassenbaums.
Unterschiedliche Programmiersprachen, die Mehrfachvererbung unterstützen (Common Lisp, Dylan , Julia etc.), behandeln einzelne Fälle im Rahmen der obigen Definition verschieden. In der Praxis ist dies fast immer ohne Bedeutung. Manche Implementierungen (Perl) bilden die CPL implizit durch rekursiven Abstieg im Klassenbaum. Die sich dadurch ergebende Vorrangigkeit ist allerdings nicht immer intuitiv.
Literatur
[Bearbeiten | Quelltext bearbeiten]- Common Lisp Standard – ANSI INCITS 226-1994 (R2004) ( vom 1. Januar 2014 im Internet Archive)