FSST - Hardwarenahe Programmierung
You are viewing an older revision! See the latest version
IsA
IsA (ist ein) versus HasA¶
Inheritance (Vererbung)
Man spricht bei Vererbung von einer »Ist ein«-Beziehung (siehe UML Klassendiagramm). MyLed »ist ein« DigitalOut und hat alle Eigenschaften der Klasse DigitalOut und fügt ihnen nun seine Besonderheiten, Methoden wie z.B. LedOn(), ToggleLed(), BlinkLed(), ..., hinzu. Neben den Datenelementen (Attribute) vererben sich auch die Methoden, wie z.B. write() und read(). Lediglich die Konstruktoren, die Destruktoren und die Zuweisungsoperatoren werden nicht vererbt. Bei der Erzeugung des Objektes wird der Konstruktor der DigitalOut-Klasse aufgerufen, der den Pin auf ld1 setzt:
class IsA : public DigitalOut { public: IsA(PinName ld) : DigitalOut(ld, 0){} };
Methoden: Es wird die Methode der Basisklasse (write(...) in Zeile 2 in der Methode LedOn() aufgerufen oder DigitalOut über den Bereichsauflösungs-Operator (scope resolution) „::“ in Zeile 5:
void LedOn() { write(1); } void LedOff(){ DigitalOut :: write(0); }
Neben den Datenelementen vererben sich auch die Methoden. Lediglich die Konstruktoren und die Destruktoren werden nicht vererbt. Operatoren im speziellen der Zuweisungsoperatoren wird zwar vererbt, allerdings durch den vom Compiler erzeugten Operator versteckt. Um den Operator der abgeleiteten Klasse zugänglich zu machen kann using verwendet werden:
using
using DigitalOut::operator=;
oder in der Klasse neu programmiert werden:
<<code>>
IsA &operator= (int value) {
write(value);
return *this;
}
<</code>
Aufgabe Vererbung
Schreiben Sie eine Klasse MyTimer die abgeleitet wird von der Timer-Klasse und benennen Sie alle Methoden so um, dass sie mit großem Anfangsbuchstaben beginnen. Testen Sie Ihre MyTimer-Klasse, indem Sie ein MyTimer-Objekt tm erzeugen, mit tm.Start() den Timer starten und mit tm.Stop() anhalten und das Ergebnis mit tm.CheckTimerMS() auf die serielle Schnittstelle mit pc.printf() ausgeben.
Lösung?