Vererbung und Polymorphismus Benno List OO Get-Together 29.5.06 B. List 29.5.06 Vererbung und Polymorphismus Page 1
Klassen (Wiederholung) Klasse: Datenstruktur mit data members: Variablen: enthalten Informationen member functions: Funktionen Beispiel: Track-Klasse Daten: Track-Parameter, z.b. (κ, φ, θ, d ca, z 0 ) Funtionen: z.b. GetPt(), GetPoint (s), GetIntersection (r) B. List 29.5.06 Vererbung und Polymorphismus Page 2
Central und Forward Tracks TABLE CJKR! CJC Tracks without vertex constraints! ATTributes: 1 KAPPA F -INF +INF! Signed inverse radius 2 PHI F -PI +PI! Azimuth at DCA 3 THETA F 0. +PI! Polar angle 4 DCA F -INF +INF! Distance of Closest Approach = DCA 5 Z0 F -INF +INF! Z at DCA 6 RAD F 0. +INF! Radius at track start 7 IPTYPE I 1 2! Type of parametrization! Covariance matrix packed with subroutine COVCP 8 DKAPPA F 0. +INF! Error of KAPPA... TABLE FTRK! Forward Tracker Tracks! ATTributes:! parameters at start point 1 KAPPA F -INF +INF! signed inverse radius 2 PHI F -PI +PI! track angle in xy-plane 3 THETA F 0. +PI! polar angle 4 X F -99.0 +99.0! X 5 Y F -99.0 +99.0! Y 6 Z F 100.0 300.0! Z at which parameters given (NOT a parameter) 7 IPTYP I 1 2! type of parametrization (=2) 8 DKAPPA F 0. +INF!... B. List 29.5.06 Vererbung und Polymorphismus Page 3
Zwei Klassen oder eine? Central tracks und forward tracks: Viele Gemeinsamkeiten Unterschiedliche Parameter mit verschiedener Bedeutung 2 Klassen: CentralTrack und ForwardTrack: Code in Klassen ist einfach und übersichtlich User-code wird aufwendig, z.b. 2-Spur-Kombinationen: => getrennte Schleifen für central+central, central+forward, forward+forw. 1 Klasse: Verbirgt Komplexität, User-code einfach Code in Klasse aufwendig: viele Verzweigungen if central... else... Datenstruktur nicht optimal B. List 29.5.06 Vererbung und Polymorphismus Page 4
Lösung: Vererbung! Zwei Klassen und eine Eine Basisklasse: Track => enthält gemeinsamen code, eventuell auch gemeinsame Daten Zwei abgeleitete Klassen: CentralTrack und ForwardTrack => enthalten Daten, die unterschiedlich sind => enthalten code, der an die verschiedenen Daten angepasst ist Track UML-Diagramme: CentralTrack ForwardTrack Klasse ist abgeleitet von B. List 29.5.06 Vererbung und Polymorphismus Page 5
Praxis class Track { virtual float GetPx() = 0; // Depends on Parameters virtual float GetDca() =0; // Depends on Parameters float GetPt() { return sqrt(getpx()*getpx() + GetPy()*GetPy()); } class CentralTrack: public Track { float GetPx() { return cos(phi)/abs(kappa); } float GetDca() { return dca; } float kappa, phi, theta, dca, z0; class ForwardTrack: public Track { float GetPx() { return cos(phi)/abs(kappa); } float GetDca() { return f(x0, y0, z0); } float kappa, phi, theta, x0, y0, z0; Vererbung: Central Track ist Tochterklasse von Track B. List 29.5.06 Vererbung und Polymorphismus Page 6
Praxis class Track { virtual float GetPx() = 0; // Depends on Parameters virtual float GetDca() =0; // Depends on Parameters float GetPt() { return sqrt(getpx()*getpx() + GetPy()*GetPy()); } class CentralTrack: public Track { float GetPx() { return cos(phi)/abs(kappa); } float GetDca() { return dca; } float kappa, phi, theta, dca, z0; Unterschiedliche Daten class ForwardTrack: public Track { float GetPx() { return cos(phi)/abs(kappa); } float GetDca() { return f(x0, y0, z0); } float kappa, phi, theta, x0, y0, z0; Vererbung: Central Track ist Tochterklasse von Track B. List 29.5.06 Vererbung und Polymorphismus Page 7
Praxis class Track { virtual float GetPx() = 0; // Depends on Parameters virtual float GetDca() =0; // Depends on Parameters float GetPt() { return sqrt(getpx()*getpx() + GetPy()*GetPy()); } class CentralTrack: public Track { float GetPx() { return cos(phi)/abs(kappa); } float GetDca() { return dca; } float kappa, phi, theta, dca, z0; Unterschiedliche Daten class ForwardTrack: public Track { float GetPx() { return cos(phi)/abs(kappa); } float GetDca() { return f(x0, y0, z0); } float kappa, phi, theta, x0, y0, z0; Abstrakte Funktionen: Deklariert, aber nicht definiert (implementiert) Vererbung: Central Track ist Tochterklasse von Track Implementierung der abstrakten Funktionen für eine konkrete Tochterklasse B. List 29.5.06 Vererbung und Polymorphismus Page 8
Praxis class Track { virtual float GetPx() = 0; // Depends on Parameters virtual float GetDca() =0; // Depends on Parameters float GetPt() { return sqrt(getpx()*getpx() + GetPy()*GetPy()); } class CentralTrack: public Track { float GetPx() { return cos(phi)/abs(kappa); } float GetDca() { return dca; } float kappa, phi, theta, dca, z0; Unterschiedliche Daten class ForwardTrack: public Track { float GetPx() { return cos(phi)/abs(kappa); } float GetDca() { return f(x0, y0, z0); } float kappa, phi, theta, x0, y0, z0; Abstrakte Funktionen: Deklariert, aber nicht definiert (implementiert) Vererbung: Central Track ist Tochterklasse von Track Implementierung der abstrakten Funktionen für eine konkrete Tochterklasse GetPt(): Definiert in Basisklasse => wird ererbt! Benutzt abstrakte Methoden GetPx() und GetPy() => allgemeine Definition, obwohl Funktionsweise von GetPx() vom Tracktyp abhängt! B. List 29.5.06 Vererbung und Polymorphismus Page 9
Wie benutzt man das? int main() { Track t; // Geht nicht: Track ist keine vollständige Klasse! CentralTrack ct1 (...); CentralTrack ct2 (...); ForwardTrack ft3 (...); ForwardTrack ft4 (...); // ein CentralTrack-Objekt // noch eins // ein ForwardTrack-Objekt // noch eins float pt1 = ct1.getpt(); // pt des ersten Tracks Track *t1 = &ct1; pt1 = t1->getpt(); Track *t3 = &ft3; // Pointer auf ersten Track // nochmal pt des ersten Tracks // Pointer auf dritten Track } float m13 = InvariantMass (t1, t3, 0.139, 0.139); // invariante Masse von 1 und 3 float InvariantMass (Track *t1, Track *t2, float m1, float m2) { return sqrt (pow (t1->gete(m1) + t2->gete(m2), 2) - pow (t1->getpx(m1) + t2->getpx(), 2) - pow (t1->getpy(m1) + t2->getpy(), 2) - pow (t1->getpz(m1) + t2->getpz(), 2)); } B. List 29.5.06 Vererbung und Polymorphismus Page 10
Polymorphismus Basisklasse: Definiert, was alle Tracks leisten: GetPX(), GetPt(), GetE(float m),... Tochterklassen: Enthalten die eigentlichen Daten, und den code, der diese Daten nutzt Oft kann man kein Objekt der Basisklasse kreieren => abstrakte Basisklasse Ein CentralTrack ist ein Track : => Vererbung = ist ein -Verhältnis Ein Pointer auf CentralTrack ist ein Pointer auf Track Kann über einen Pointer auf Track Funktionen der Tochterklasse aufrufen, die nur dort implementiert sind, wenn sie in der Basisklasse deklariert sind! B. List 29.5.06 Vererbung und Polymorphismus Page 11
Vererben <-> Enthalten Oft vorkommende Situation: Habe Klasse, die Funktionalität bereitstellt: Motor::GetPS() Zweite Klasse braucht diese Funktionalität: Auto::GetPS() Ansatz: Vererbung: class Auto: public Motor {... Don't Do That!!! Ein Auto ist nicht ein Motor!!! Ein Auto hat einen Motor! Also: Auto::GetPS() { return dermotor.getps(); } B. List 29.5.06 Vererbung und Polymorphismus Page 12
Nochmal Benutze Vererbung nur, wenn eine ist ein -Verhältnis vorliegt Ein hat ein -Verhältnis: Benutze Agglomeration: Führe ein data member ein: class Motor { GetPS() { return ps; } float ps; // die Leistung des Motors float drehmoment, maxdrehzahl; int zylinder, ventile, kraftstofftyp; class Auto { // Ein Auto ist ein Auto ist ein Auto ist kein Motor... GetPS() { return dermotor->getps(); } // Leistung des Autos = Leistung des Motors Motor *dermotor; // Zeiger auf den Motor des Autos: Auto hat einen Motor float leergewicht, laenge, hoehe, breite, maximalgeschwindigkeit; B. List 29.5.06 Vererbung und Polymorphismus Page 13
In UML Typische Situation: Es gibt nicht das Auto, es gibt nur spezifische Autos: PKW, LKW,... Es gibt nicht den Motor, es gibt nur spezifische Motoren Aber: Jedes Auto hat einen Motor Die Leistung jedes Autos ist die Leistung seines Motors Auto Motor UML-Diagramme: ist enthalten in LKW PKW DieselM OttoM ist abgeleitet von B. List 29.5.06 Vererbung und Polymorphismus Page 14
H1OO Beispiel: Jeder H1Track hat einen zugehörigen H1PartCand Jeder H1ForwardTrack hat eine zugehörige H1HelixTrajectory GetTrajectory() ist eine Methode von H1Track H1Track + GetTrajectory() H1PartCand UML-Diagramme: Class + PublicMethod () - PrivateMethod() H1Vertex FittedTrack H1NonVertex FittedTrack H1Trajectory öffentliche Methode, interne Methode H1Central Track H1Forward Track H1Helix Trajectory B. List 29.5.06 Vererbung und Polymorphismus Page 15
Praktische Aspekte Polymorphismus funktioniert nur mit Funktionen, die als virtual gekennzeichnet sind virtual wird vererbt : Funktion gleichen Namens und mit gleichen Argumenten in Tocherklasse ist automatisch virtual (Basis)klasse mit einer virtual Methode muss IMMER einen Destruktor haben, der virtual ist. Virtuelle Methoden können eine Implementierung in der Basisklasse haben, die vererbt wird Virtuelle Methoden ohne Implementierung: =0 (pure virtual) => macht Klasse abstrakt => Klasse kann nicht instanziiert werden! B. List 29.5.06 Vererbung und Polymorphismus Page 16
Syntax class Track { virtual float GetPx() = 0; virtual float GetDca() =0; float GetPt(); virtual ~Track(); class CentralTrack: public Track { float GetPx(); float GetDca(); float kappa, phi, theta, dca, z0; B. List 29.5.06 Vererbung und Polymorphismus Page 17