\documentclass{bschlangaul-aufgabe}
\bLadePakete{java,uml}
\begin{document}
\bAufgabenMetadaten{
  Titel = {Vererbung: Generalisierung und Spezialisierung},
  Thematik = {Bankkonten},
  Referenz = OOMUP.Vererbung.Bankkonten,
  RelativerPfad = Module/20_OOMUP/Vererbung/Aufgabe_Bankkonten.tex,
  ZitatSchluessel = oomup:fs:3,
  ZitatBeschreibung = {Seite 60, Oldenburg, Informatik II, S. 128},
  BearbeitungsStand = mit Lösung,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {Vererbung, Generalisierung, Spezialisierung, Klassendiagramm, Implementierung in Java},
}

Eine kleine Bank bietet drei Arten von Konten an: Girokonten, Sparkonten
und Geschäftskonten. Alle drei Kontoarten haben die Methoden
\bJavaCode{Einzahlen}, \bJavaCode{Abheben} und \bJavaCode{KontostandGeben} sowie die
Attribute \bJavaCode{kontostand} und \bJavaCode{kontonummer}.
\index{Vererbung}
\footcite[Seite 60, Oldenburg, Informatik II, S. 128]{oomup:fs:3}

\begin{itemize}
\item Sparkonten haben einen Zinssatz und eine Methode \bJavaCode{Verzinsen},
die den Jahreszins zum Guthaben addiert. Maximalbetrag beim Abheben ist
der aktuelle Kontostand.

\item Girokonten können um bis 2000 € überzogen werden (Dispokredit).

\item Geschäftskonten haben einen variablen Dispokredit, der über die
Methode \bJavaCode{DispoKreditSetzen} festgelegt wird; der Startwert für den
Dispokredit wird mit dem Konstruktor beim Einrichten des Kontos als
Parameter mitgegeben.
\end{itemize}

\begin{enumerate}

%%
% a
%%

\item Überlege dir, welche Konten
Generalisierungen\index{Generalisierung} bzw.
Spezialisierungen\index{Spezialisierung} anderer Konten sind. Warum ist
es sinnvoll, eine Klasse Konto als oberste Klasse
Generalisierungshierarchie einzuführen?

\begin{bAntwort}
Da alle Konten die Methoden \bJavaCode{einzahlen()}, \bJavaCode{abheben()} und
\bJavaCode{kontostandGeben()} sowie die Attribute \bJavaCode{kontostand} und
\bJavaCode{kontonummer} besitzen, bietet sich deren Verwaltung in einer
einzigen Klasse an. Da jede Kontoart aber auch individuelle
Eigenschaften bzw. Methoden hat, muss es für jede auch eine eigene
Klasse geben. Daher bietet es sich an, die Gemeinsamkeiten in eine
Oberklasse \bJavaCode{Konto} auszulagern (Generalisierung).
\end{bAntwort}

%%
% b
%%

\item Entwirf ein Klassendiagramm\index{Klassendiagramm} für die Klassen
\bJavaCode{Konto}, \bJavaCode{Girokonto}, \bJavaCode{Sparkonto},
\bJavaCode{Geschaeftskonto}.

\begin{bAntwort}
Da das Geschäftskonto genauso wie das Girokonto einen Dispokredit
besitzt, dieser nur anders festgelegt wird, wurde bei der Modellierung
die Klasse \bJavaCode{Geschaeftskonto} als Unterklasse der Klasse
\bJavaCode{Girokonto} umgesetzt.

Die Oberklasse \bJavaCode{Konto} wurde abstrakt modelliert, da von ihr direkt
keine Objekte erzeugt werden können.

Die Attribute \bJavaCode{kontostand} und \bJavaCode{kontonummer} in der Klasse
\bJavaCode{Konto} haben den Sichtbarkeitsmodifikator \bJavaCode{private}, da die
Unterklassen nie direkt auf die Attribute zugreifen, sondern die zur
Verfügung stehenden Methoden dafür verwenden.

\begin{center}
\begin{tikzpicture}
\umlclass{Konto}{
  - kontostand: double\\
  - kontostand: int
}{
  + einzahlen(betrag: double)\\
  + abheben(betrag: double)\\
  + kontostandGeben(): double
}

\umlclass[below left=1.5cm and -1cm of Konto]{Sparkonto}{
  - zinssatz: double
}{
  + verzinsen()
}

\umlclass[below right=1.5cm and -1cm of Konto]{Girokonto}{
  \# dispokredit: double
}{}

\umlclass[below=1cm of Girokonto]{Geschaeftskonto}{}{
 + Geschaeftskonto(dispokredit: double)\\
 + dispokreditSetzen(dispokreditNeu: double)
}

\umlVHVinherit[arm2=-2cm]{Sparkonto}{Konto}
\umlVHVinherit[arm2=-2cm]{Girokonto}{Konto}
\umlinherit{Geschaeftskonto}{Girokonto}
\end{tikzpicture}
\end{center}
\end{bAntwort}

%%
% c
%%

\item Implementiere\index{Implementierung in Java} die Klassen in einem
eigenen Projekt und teste die vorhandenen Methoden.

\begin{bAntwort}
\bJavaDatei[firstline=3]{aufgaben/oomup/pu_3/bankverwaltung/Konto}
\bJavaDatei[firstline=3]{aufgaben/oomup/pu_3/bankverwaltung/Sparkonto}
\bJavaDatei[firstline=3]{aufgaben/oomup/pu_3/bankverwaltung/Girokonto}
\bJavaDatei[firstline=3]{aufgaben/oomup/pu_3/bankverwaltung/Geschaeftskonto}
\end{bAntwort}

\end{enumerate}
\end{document}
