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
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 Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://wikimedia.org/api/rest_v1/“:): {\displaystyle C} wird von den direkten Superklassen Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://wikimedia.org/api/rest_v1/“:): {\displaystyle C_1, C_2, .. C_n} (in dieser Reihenfolge) abgeleitet. Dann erzeugt die zweistellige Relation
eine totale Ordnung auf der Menge aus Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://wikimedia.org/api/rest_v1/“:): {\displaystyle C} und ihren direkten Superklassen. Bildet man die Vereinigung Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://wikimedia.org/api/rest_v1/“:): {\displaystyle R} mit
- Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://wikimedia.org/api/rest_v1/“:): {\displaystyle R = \bigcup_{C \in S_c}{R_C}}
aller direkten /und/ indirekten Superklassen Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://wikimedia.org/api/rest_v1/“:): {\displaystyle S_c} von Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://wikimedia.org/api/rest_v1/“:): {\displaystyle C} , so ist diese Relation eine partielle Ordnung der Superklassen.
Es gibt widersprüchliche Fälle, in denen die Vorrangigkeit einer Superklasse Fehler beim Parsen (Konvertierungsfehler. Der Server („https://wikimedia.org/api/rest_“) hat berichtet: „Cannot get mml. Server problem.“): {\displaystyle C_{i}} vor einer Superklasse Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://wikimedia.org/api/rest_v1/“:): {\displaystyle C_j} bezüglich der abgeleiteten Klasse Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://wikimedia.org/api/rest_v1/“:): {\displaystyle C} genauso gefordert ist, wie umgekehrt. In diesem Fall erfolgt eine Fehlermeldung durch den Compiler.
Falls Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://wikimedia.org/api/rest_v1/“:): {\displaystyle R} 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 Fehler beim Parsen (MathML mit SVG- oder PNG-Rückgriff (empfohlen für moderne Browser und Barrierefreiheitswerkzeuge): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „https://wikimedia.org/api/rest_v1/“:): {\displaystyle C} 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
- Common Lisp Standard – ANSI INCITS 226-1994 (R2004) (Memento vom 1. Januar 2014 im Internet Archive)