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

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
  • Common Lisp Standard – ANSI INCITS 226-1994 (R2004) (Memento vom 1. Januar 2014 im Internet Archive)