\documentclass{bschlangaul-aufgabe}
\bLadePakete{java,uml}
\begin{document}
\bAufgabenMetadaten{
  Titel = {Vererbung},
  Thematik = {Kleintierpraxis},
  Referenz = OOMUP.Vererbung.Kleintierpraxis,
  RelativerPfad = Module/20_OOMUP/Vererbung/Aufgabe_Kleintierpraxis.tex,
  ZitatSchluessel = oomup:ab:5,
  BearbeitungsStand = mit Lösung,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {Vererbung, Klassendiagramm, Implementierung in Java},
}

In der Kleintierpraxis Dr. Huf werden \emph{Hunde}, \emph{Katzen} und
\emph{Heimtiere}\footnote{Unter Heimtiere versteht man hier Kleintiere
(d. h. keine Rinder, Pferde etc.), die zu Hause gehalten werden und
keine Hunde oder Katzen sind (beispielsweise Meerschweinchen oder
Kaninchen). Heimtiere können auch Nutztiere sein, die zur Schlachtung
gehalten werden (\zB Hühner). In diesem Fall muss ein Tierarzt darauf
achten, nur Medikamente anzuwenden, die für Lebensmittel liefernde Tiere
zugelassen sind.} behandelt. In der Praxissoftware werden von jedem Tier
\emph{Name}, \emph{Alter} (in Jahren) und \emph{Gewicht} (in kg mit
mindestens 2 Dezimalen) erfasst. Bei einem \emph{Hund} wird zusätzlich
aufgenommen, ob er \emph{reinrassig} ist, bei einer \emph{Katze}, ob sie
ausschließlich \emph{in der Wohnung gehalten} wird, und beim
\emph{Heimtier}, ob es zur \emph{Lebensmittellieferung} dient.
\index{Vererbung}
\footcite{oomup:ab:5}

\begin{enumerate}

%%
% (a)
%%

\item Erstellen Sie ein entsprechendes
Klassendiagramm\index{Klassendiagramm} (zunächst ohne Methoden), das den
oben beschriebenen Sachverhalt geeignet erfasst.

\begin{tikzpicture}
\umlclass[type=abstrakt,x=3.5,y=3.5]{Kleintier}{
  \# name : String \\
  \# alter : int \\
  \# gewicht : float
}{}

\umlclass{Hund}{- name : String}{}
\umlclass[x=3.5]{Katze}{- istHauskatze : boolean}{}
\umlclass[x=8]{Heimtier}{- wirdGeschlachtet : boolean}{}
\umlVHVinherit[arm1=1.5cm]{Hund}{Kleintier}
\umlVHVinherit[arm1=1.5cm]{Katze}{Kleintier}
\umlVHVinherit[arm1=1.5cm]{Heimtier}{Kleintier}
\end{tikzpicture}

%%
% (b)
%%

\item Implementieren Sie die Klassen\index{Implementierung in Java}
gemäß des Modells aus Teilaufgabe a in der Programmierumgebung BlueJ.
Beachten Sie dabei die abstrakte Oberklasse!

\bPseudoUeberschrift{Klasse \emph{Kleintier}}
\bJavaDatei[firstline=3,lastline=6]{aufgaben/oomup/klassendiagramm/kleintierpraxis/Kleintier}
\bJavaDatei[firstline=10,lastline=13]{aufgaben/oomup/klassendiagramm/kleintierpraxis/Kleintier}

\bPseudoUeberschrift{Klasse \emph{Hund}}
\bJavaDatei[firstline=3,lastline=8]{aufgaben/oomup/klassendiagramm/kleintierpraxis/Hund}

\bPseudoUeberschrift{Klasse \emph{Katze}}
\bJavaDatei[firstline=3,lastline=9]{aufgaben/oomup/klassendiagramm/kleintierpraxis/Katze}

\bPseudoUeberschrift{Klasse \emph{Heimtier}}
\bJavaDatei[firstline=3,lastline=9]{aufgaben/oomup/klassendiagramm/kleintierpraxis/Heimtier}

%%
% (c)
%%

\item Die Praxissoftware verfügt über eine Methode
\verb|datenAusgeben()|, die den Namen und das Alter eines Tieres auf dem
Bildschirm ausgibt. Fügen Sie im Klassendiagramm die Methode an
geeigneter Stelle ein und implementieren Sie sie.

\begin{bAntwort}
Einfügen in der abstrakten Klasse \emph{Heimtier}. Fertiges
Klassendiagramm siehe 1 (d)

\begin{minted}{java}
    public void datenAusgeben()
    {
        System.out.println("Name: " + name + ", Alter: " + alter);
    }
\end{minted}
\end{bAntwort}

%%
% (d)
%%

\item Die Kosten für eine Narkose setzen sich zusammen aus einer
Grundgebühr, die von der Tierart abhängt, und aus den Kosten für das
verwendete Narkotikum. Diese wiederum berechnen sich aus dem Preis des
Narkotikums pro kg Körpergewicht multipliziert mit dem Gewicht des
Tieres. Ergänzen Sie das Klassendiagramm entsprechend um die Methode
\verb|narkosekostenBerechnen()|, die die Kosten für eine Narkose auf dem
Bildschirm ausgibt, und implementieren Sie sie.

\begin{tikzpicture}
\umlclass[type=abstrakt,x=3.5,y=4]{Kleintier}{
  \# name : String \\
  \# alter : int \\
  \# gewicht : float
}{
  + datenAusgeben() : void\\
  + narkoseKostenBerechnen(): float
}

\umlclass{Hund}{- name : String}{}
\umlclass[x=3.5]{Katze}{- istHauskatze : boolean}{}
\umlclass[x=8]{Heimtier}{- wirdGeschlachtet : boolean}{}
\umlVHVinherit[arm1=1.5cm]{Hund}{Kleintier}
\umlVHVinherit[arm1=1.5cm]{Katze}{Kleintier}
\umlVHVinherit[arm1=1.5cm]{Heimtier}{Kleintier}
\end{tikzpicture}

\begin{bAntwort}
Einfügen in der abstrakten Klasse \emph{Heimtier}.

\bJavaDatei[firstline=3]{aufgaben/oomup/klassendiagramm/kleintierpraxis/Hund}

Einfügen in den Konstruktor der Klasse \emph{Hund}:
\begin{minted}{java}
narkoseGrundGebuehr = 1.50f;
\end{minted}

Einfügen in den Konstruktor der Klasse \emph{Katze}:
\begin{minted}{java}
narkoseGrundGebuehr = 1f;
\end{minted}

Einfügen in den Konstruktor der Klasse \emph{Heimtier}:
\begin{minted}{java}
narkoseGrundGebuehr = 2f;
\end{minted}
\end{bAntwort}

%%
% (e)
%%

\item Falls es sich bei dem zu behandelnden Tier um einen Hund handelt,
soll die Methode \verb|datenAusgeben()| (siehe Teilaufgabe c) dies
zusammen mit dem Namen und dem Alter des Tieres auf dem Bildschirm
ausgeben. Außerdem soll in diesem Fall ausgegeben werden, ob der Hund
reinrassig ist oder nicht.

\begin{bAntwort}
Einfügen in der Klasse \emph{Hund}:

\bJavaDatei[firstline=12,lastline=20]{aufgaben/oomup/klassendiagramm/kleintierpraxis/Hund}
\end{bAntwort}
\end{enumerate}

\end{document}
