***** Übungen: PHP/OOP - Vererbung ***** PHP/OOP_7: Vererbung - Vererbungsdiagramm analyiseren (Chipkarte) Betrachten Sie das Klassendiagramm *LINK 10phpoop/oopphp07-bild-chipkarte.png LINK* 1) Welches sind "Elternklasse(n)", welches "Kindklasse(n)"? 2) Schreiben Sie eine Liste: Welche Attribute und Methoden hat die Klasse "Mensakarte"? 3) Sowohl "Chipkarte" als auch "Bibliothekskarte" haben eine Methode "statusAnzeigen()". Wie verhält sich diese Methode, wenn ein Objekt der Klasse Bibliothekskarte instanziiert wird? 4) Halten Sie es für sinnvoll, die Klasse Chipkarte abstrakt zu gestalten? Begründen Sie Ihre Antwort. @@@ PHP/OOP_7-0: SEHR einfache Vererbungsaufgabe: Hund Programmieren Sie eine Klasse Hund (Attribute: groesse, Methoden: bellen(), diese MEthode gibt aus: "Wuff Wuff") mit den Gettern und Settern (alt+einfügen!) und eine Unterklasse Jagdhund (mit der Methode fass()). Die Methode fass() gibt aus "Ich habe das Kaninchen geschnappt." --- Brauchen Sie für die Klasse "Jagdhund" auch Getter und Setter? --- Instanziieren Sie jeweils ein Objekt der beiden Klassen --- Lassen Sie sich für das jeweilige Objekt die Attributwerte ausgeben und verwenden Sie die Methoden. --- Erweitern Sie die Klasse Jagdhund so, dass für die Methode "fass()" ein Ziel als Parameter übergeben werden kann (z.B. "fass('Kaninchen')"); die Methode gibt dann "Ich habe das Kaninchen geschnappt" aus. @@@ PHP/OOP_7-1: Einfache Vererbungsaufgabe: Artikelverwaltung Sie programmieren die Produktverwaltung eines Warenwirtschaftssystems. Jedes Produkt hat eine Artikelnummer, einen Namen und einen Nettopreis, außerdem die entsprechenden Getter und Setter (alt+einfügen!). Besondere Produkte sind die Musik-CD, die noch die Laufzeit in Minuten und den Interpreten enthält, und das Kinderfahrrad, wo über die Methode "farbeSetzen(farbe:String)" beim Bestellen eine Farbe gewählt werden kann. - Erstellen Sie ein Klassendiagramm zu dieser Situation. - Programmieren Sie die Klassen. Weisen Sie allen Attributen Initialwerte zu. Alle Attribute und Methoden sind der Einfachheit halber erst mal public. - Testen Sie, ob alles funktioniert, indem Sie ---- ein Objekt jeder Klasse instanziieren ---- für die Objekte die einzelnen Attributswerte ausgeben lassen ---- für die Objekte die einzelnen Methoden aufrufen @@@ PHP/OOP_7-2: Vererbung im UML-Diagramm darstellen und programmieren Sie verwalten in einem Programm die Mitarbeiter einer Firma. Alle Mitarbeiter haben einen Vornamen und einen Nachnamen und eine Personalnummer. Allen Mitarbeiter wird ein Gehalt ausgezahlt (zahleGehalt(gehalt)). Die Mitarbeiter im Außendienst können außerdem einen Dienstwagen benutzen (leiheDienstwagen()). Man kann weiterhin abfragen, wie viele Außenkontakte sie hatten (getAussenkontakte()) - natürlich muss die Anzahl der Außenkontakte auch in einem Attribut gespeichert werden. Die Mitarbeiter in der Managementetage bekommen einmal jährlich einen Bonus ausgezahlt (zahleBonus(bonus)). Außerdem können Sie die Personalnummer aller anderen Mitarbeiter herausfinden (durch Eingabe des Nachnamens (holePersonalnummer(nachname)). Die EDV ist noch nicht so ausgereift, deshalb wird als Antwort auf diese Aktion immer "Mitarbeiter nicht verfügbar" ausgegeben. Die Mitarbeiter in der Lagerverwaltung haben keine besonderen Merkmale, die sie von anderen Mitarbeitern unterscheiden. a) Erstellen Sie ein UML-Diagramm zu dieser Situation. b) Programmieren Sie die Klassen. Testen Sie die Lauffähigkeit, indem Sie einige Mitarbeiter als Objekte instanziieren und die Methoden ausprobieren. @@@ PHP/OOP_7-3: Vererbung programmieren - Pizzabringdienst Sie programmieren entsprechend *LINK 10phpoop/oopphp07-bild-pizza.png LINK* ein Bestellsystem für einen Pizzabringdienst. Name (setName), Preis (setPreis) und Rabatt (setRabatt) werden vom System gesetzt; der Einfachheit halber machen Sie das von Hand (indem Sie an der korrekten Stelle die entsprechenden Setter mit beispielhaften Werten verwenden). Saucentyp und Schärfegrad werden vom User gesetzt. Auch das machen Sie von Hand. Probieren Sie aus, ob die Klassen so arbeiten wie erwartet. Versuchen Sie auch auf ein Objekt der Unterklassen die in der Oberklasse definierten Methoden anzuwenden. Zusatzaufgabe a: Erstellen Sie ein Formular, mit dem die Bestellung vorgenommen wird (sie werden dabei einige Vereinfachungen vornehmen müssen, z.B. dass es nur ein Produkt gibt oder- falls es mehrere gibt - dass die Produkte in einem Array mit Initialwert gespeichert sind). Zusatzaufgabe b: Erzeugen Sie eine Datenbanktabelle, in der die Pizzas inklusive Preis etc. gespeichert sind. Auf diese Tabelle wird bei Ausführen eines Bestellvorgangs zugegriffen. @@@ PHP/OOP_7-4: Vererbung mit DB-Anbindung Erweitern Sie Ihr Programm aus 7-3 so, dass bei der Instanziierung eines Mitarbeiters seine Daten aus einer DB geholt werden (Konstruktor!). Erweitern Sie auch das Klassendiagramm entsprechend! Testen Sie die Funktionsweise, indem Sie einen Manager instanziieren und die Methode holePersonalnummer verwenden. Den Namen des Mitarbeiters geben Sie (wie in 7-2) direkt im Programmcode in die Methode ein, also bspw. --- PHP-Code Start --- $manager1 = new Manager; $name = 'huber'; $personalnummer = $manager1->getPersonalnummer($name); echo "

Mitarbeiter " . $name . " hat Personalnummer " . $personalnummer . "

\n"; --- Code Ende --- Beachten Sie, dass es grundsätzlich verschiedene Möglichkeiten gibt, dieses Problem zu realisieren. Benutzen Sie den folgenden Tabellen-Code für die DB. Eine Klasse für die DB-Verbindung sollten Sie noch aus Aufgabe 6-2 haben. Tabelle: --- MySQL-Code Start --- CREATE TABLE `mitarbeiter` ( `id` INT NOT NULL , `nachname` VARCHAR(45) NULL , `personalnummer` INT NULL , PRIMARY KEY (`id`) ); INSERT INTO `mitarbeiter` (`id`, `nachname`, `personalnummer`) VALUES ('1', 'huber', '17312214'); INSERT INTO `mitarbeiter` (`id`, `nachname`, `personalnummer`) VALUES ('2', 'maier', '31553212'); INSERT INTO `mitarbeiter` (`id`, `nachname`, `personalnummer`) VALUES ('3', 'zuckerberg', '48818828'); --- Code Ende --- @@@ PHP/OOP_7-5: Vererbung mit DB-Anbindung und Eingabemaske Erweitern Sie Ihr Programm von 7-4 so, dass der Manager den Nachnamen des Mitarbeiters in ein Eingabefeld eingeben kann und dann die zugehörige Personalnummer bekommt. @@@ PHP/OOP_7-6: Vererbungsaufgabe, Zusammenfassung (einfach) - Programmieren Sie die Klassen "Logistikverwaltung" und "Paketverfolgung" wie im Klassendiagramm *LINK 10phpoop/oopphp07_bild_logistik-klasse.png LINK* gezeigt. Programmieren Sie die Getter und Setter von Hand! - Erzeugen Sie zwei neue Objekte $paketverfolgung1 und $paketverfolgung2 der Klasse Paketverfolgung. - Setzen Sie für die beiden Objekte zwei unterschiedliche Verfolgungsnummern, indem Sie den Setter benutzen. - Lassen Sie sich die beiden Verfolgungsnummern ausgeben, indem Sie den Getter benutzen. [Je nach Ihrem Kenntnisstand entscheiden Sie sich für eine der folgenden drei Aufgaben:] - Formular SEHR EINFACH: Erzeugen Sie eine Oberfläche, über die durch Eingabe einer Transportnummer und die Eingabe einer Verfolgungsnummer ein neuer Transportvorgang "Paketverfolgung" angelegt werden kann. (Dazu müssen Sie eine zusätzliche Methode programmieren!) Durch das Absenden des Formulars wird ein neues Objekt der Klasse Paketverfolgung erzeugt, die entsprechenden Werte zugewiesen und zur Überprüfung ausgegeben ("Die Transportnummer des neu erzeugten Objekts beträgt 122, die Verfolgungsnummer ist 184."). - Formular EINFACH: Erweitern Sie die Unterklasse "Paketverfolgung" so, dass über den Konstruktor jedem neuen Objekt eine zufällige Paketverfolgungsnummer zugewiesen wird (php-Funktion rand(minwert, maxwert), bsp.: $zufallszahl = rand(1,100) erzeugt eine Zufallszahl zwischen 1 und 100). Erzeugen Sie eine Oberfläche, über die durch Eingabe einer Transportnummer ein neuer Transportvorgang "Paketverfolgung" angelegt werden kann. Lassen Sie sich nach dem Absenden des Formulars die Transportnummer und die Paketverfolgungsnummer ausgeben. - Formular MITTELSCHWIERIG: Gehen Sie wie in Aufgabe EINFACH vor mit dem Unterschied, dass bei Anlegen eines neuen Transportvorgangs der neue Transportvorgang in eine DB geschrieben wird. - FORMULAR SCHWIERIG: Erzeugen Sie zwei Formulare: --- Anlegen eines neuen Transportvorgangs (wie in Aufgabe MITTELSCHWIERIG) --- Abfragen einer Paketverfolgungsnummer (durch Eingabe der Transportnummer) Alle Daten werden aus der DB geholt bzw. in die DB geschrieben.