Class Precedence List
BearbeitenIn der Objektorientieren Programmierung ist die Class Precedence List (CPL) ist eine totale Ordnung der Superklassen einer Klasse nach ihrer Vorrangigkeit. Sie dient in der Methodenauswahl innerhalb eines Methodenaufrufs und wird von Programmiersprachen verwendet, die Mehrfachvererbung unterstützen.
Jede Klasse hat eine eigene CPL und diese wird herangezogen, um die Liste der sorted applicable methods, der nach Vorrangigkeit sortierten, anwendbaren Methoden zu bestimmen, anhand derer schließlich der Methodendispatch durchgeführt werden kann.
Die Notwendigkeit einer CPL ergibt sich daraus, dass bei Mehrfachvererbung mehr als ein Pfad von der Klasse zur Wurzel des Klassenbaumes möglich ist und zwischen nebengeordneten Klassen keine intrinische Vorrangigkeit gegeben ist.
Synthese
BearbeitenJede Klasse wird mit einer oder mehreren direkten Superklassen definiert. Durch die Reihenfolgen, in der die Superklassen in den Klassendefinitionen benannt werden, ist eine Topolgische Ordnung wie folgt gegeben:
Angenommen eine Klasse wird von den direkten Superklassen (in dieser Reihenfolge) abgeleitet. Dann ezeugt 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 einfach durch rekursiven Abstieg im Klassenbaum. Die sich dadurch ergebende Vorrangigkeit ist allerdings nicht immer intuitiv.