Zurück

Objektorientierte Programmierung

Übungen

Übung 7-1

Virtuelle Methoden und pur virtuelle Methoden in C++, abstrakte Methoden und Interfaces in Java, abstrakte Klassen

  1. Was versteht man unter früher, was unter später Bindung? Wie werden - per Default - in C++ Methoden gebunden? Wie in Java?
  2. Machen Sie sich theoretisch wie praktisch bitte den Unterschied in C++ zwischen virtuellen und pur virtuellen Methoden (noch einmal) deutlich. Wann macht es (nur) Sinn, eine Methode als virtuell zu deklarieren? Wann macht es Sinn, eine pur virtuelle Methode bereitzustellen?
  3. Was ist eine abstrakte Methode in Java?
  4. Was ist eine abstrakte Klasse a) generell, b) in Java, c) in C++?
  5. Was versteht man in Java unter einem Interface? Wozu wird ein solches benötigt? Weshalb besitzt C++ (in diesem formalen Sinne) keine Interfaces?

Übung 7-2

Abstrakte Klassen - C++-Beispiel "Grafikobjekte"

In den hier verfügbaren PDF- und C++-Dateien finden Sie Code zum Aspekt der Bildung von pur virtuellen Methoden und (darauf aufbauend) abstrakten Klassen.

  1. Erstellen Sie zunächst ein C++-Projekt namens "GO", bei dem Sie die hier beteiligten Klassen in strukturierter Form in eigene Quellcode-Dateien auslagern. D.h. u.a. legen Sie die Dateien go.h und go.cpp an...
  2. Erweitern Sie das Szenario dann bitte um eine Klasse Kreis, die ebenfalls von GO erbt und - wie in der Vorlesung besprochen - eine sinnhafte Modellierung eines Kreis-Objektes (auf einer zweidimensionalen Ebene) darstellt.
  3. Sorgen Sie bitte schließlich dafür, dass das nachstehend gezeigte kleine Hauptprogramm - nach naheliegender Ergänzung um die Parameter beim Konstruktor(anstoß) von Kreis - korrekt funktioniert.
  4. überlegen Sie anschließend bitte, dass es sinnvoll wäre, die Klasse GO zu einer abstrakten Klasse zu machen - und sorgen Sie dafür!
  5. Wenn Sie mögen und noch Ausdauer haben, dann können Sie hier auch die Ergänzung einer Klasse Dreieck vornehmen...

int main() 
{
    Punkt p1(10.0, 20.0);
    // ggf. hier weitere Punkte definieren, falls dies für die Instanziierung 
    // des u.a. Kreis-Objektes sinnvoll erscheint. 
   
    RE re1(p1,Punkt(30.0, 60.0));
    Kreis Kreis1(  ... ); // hier Ihre Ergänzung vornehmen!
    
    GO *pgo = &re1;
    cout << "Umfang des Rechtecks: " << pgo->umfang() << endl;
    pgo = &Kreis1;
    cout << "Umfang des Kreises: " << pgo->umfang() << endl;
    
    return EXIT_SUCCESS;
}

Übung 7-3

Interfaces in Java

Stellen Sie in Java bitte ein Interface HatGewicht bereit, mit dem (abstrakt) Objekte modelliert werden, die gewogen werden können. Die Methode gewicht() soll das betreffende Gewicht (in Kilogramm) zurückliefern; die Methode schwererAls() soll zwei Objekte vom Typ HatGewicht vergleichen (und natürlich genau dann true zurückgeben, wenn das aktuelle Objekt schwerer ist als das im Parameter kommunizierte Objekt.

if (objekt1.schwererAls(objekt2))
{
   System.out.println("Das Objekt " + objekt1 + " ist das schwerere.");
}

Schreiben Sie bitte eine Klasse Lebensmittel, die das Interface HatGewicht implementiert. (Sollten Sie alles (oder vieles) zu Interfaces wieder vergessen haben oder wir in der Vorlesung (noch) gar nicht dazu gekommen sein, diese (richtig) zu besprechen, dann sehen Sie bitte wieder in einem guten Buch oder irgendwo im Internet nach.)

Übung 7-4

Modellierung einer (evtl. Mehrfach-)Vererbung: das Beispiel Kunde

Modellieren Sie bitte die nachfolgende Situation:
Im Rahmen der zu implementierenden Software gebe es bereits die Klassen Person und Firma zur Modellierung von natürlichen Personen und von (bestimmten) Unternehmen.
Nun sollen Kunden verwaltet werden; ein Kunde hat stets eine Kundennummer, einen (Kunden-)Kontostand (z.B. der noch zu begleichende Rechnungsbetrag oder ggf. eine Gutschrift) und eine bestimmte Lieferadresse.
Ein konkreter Kunde (unseres gedanklichen Unternehmens) ist stets entweder eine natürliche Person oder eine Firma.

Nach erfolgter Modellierung dürfen Sie diese jeweils in C++ und in Java implementieren. Realistischerweise überlasse ich aus Zeitgründen Ihnen, welchen konkreten Funktionsumfang Sie hierbei bereitstellen mögen. Wichtig sind aus Sicht der Objektorientierung die nachvollziehbare Modellierung der und die Beziehungen unter den Klassen.


© 1999-2021 FHDW/Peter Baeumle-Courth. Document-Id: fhdwbap:opg:028987-4