\documentclass{bschlangaul-aufgabe}
\bLadePakete{java,uml}
\begin{document}
\bAufgabenMetadaten{
  Titel = {Aufgabe 1},
  Thematik = {Banksystem},
  Referenz = 66112-2002-H.T1-A4,
  RelativerPfad = Examen/66112/2002/09/Thema-1/Aufgabe-4.tex,
  ZitatSchluessel = aud:pu:7,
  ZitatBeschreibung = {(entnommen
aus Algorithmen und Datenstrukturen, 3. \& 4. Übungsblatt, Universität
Bayreuth), Aufgabe 1},
  BearbeitungsStand = mit Lösung,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {Vererbung, Abstrakte Klasse, Implementierung in Java, Klassendiagramm},
  EinzelpruefungsNr = 66112,
  Jahr = 2002,
  Monat = 09,
  ThemaNr = 1,
  AufgabeNr = 4,
}

\def\TmpHinweis#1{{\footnotesize[#1]}}

In\index{Vererbung} einer Anforderungsanalyse\index{Abstrakte Klasse} für ein
Banksystem wird der folgende Sachverhalt beschrieben:
\footcite[(entnommen
aus Algorithmen und Datenstrukturen, 3. \& 4. Übungsblatt, Universität
Bayreuth), Aufgabe 1]{aud:pu:7}

Eine Bank hat einen Namen und sie führt Konten. Jedes Konto hat eine
Kontonummer, einen Kontostand und einen Besitzer. Der Besitzer hat einen
Namen und eine Kundennummer. Ein Konto ist entweder ein Sparkonto oder
ein Girokonto. Ein Sparkonto hat einen Zinssatz, ein Girokonto hat einen
Kreditrahmen und eine Jahresgebühr.\footcite[Thema 1 Aufgabe 4)]{examen:66112:2002:09}

\begin{enumerate}

%%
% (a)
%%

\item Deklarieren Sie geeignete Klassen in Java\index{Implementierung in
Java} [oder in C++], die die oben beschriebenen Anforderungen
widerspiegeln! Nutzen Sie dabei das Vererbungskonzept aus, wo es
sinnvoll ist! Gibt es Klassen, die als abstrakt zu verstehen sind?

\TmpHinweis{Hinweis: Geben Sie sowohl ein
Klassendiagramm\index{Klassendiagramm} als auch den Quellcode für die
beteiligten Klassen inkl. Attributen, ohne Methoden an! Achtung: in
Teilaufgabe b) werden anschließend die benötigten Konstruktoren
verlangt; Um die verschiedenen Konten in einer Bank zu verwalten, eignet
sich das Array NICHT als Datenstruktur. Informieren Sie sich über die
Datenstruktur „ArrayList“ und verwenden Sie diese.}

\begin{bAntwort}
Die Klasse Konto ist abstrakt, da ein Konto immer entweder ein Spar-
\emph{oder} ein Girokonto
ist. Ein Objekt der Klasse Konto ist deshalb nicht sinnvoll.

\begin{tikzpicture}
\umlclass{Bank}{- name}{}
\umlclass[below right=1cm of Bank]{Konto}{
\# kontonummer\\
\# kontostand}{}
\umlclass[below left=1cm of Konto]{Girokonto}{
- kreditrahmen\\
- jahresgebühr}{}
\umlclass[below right=1cm of Konto]{Sparkonto}{
- zinssatz\\}{}

\umlassoc[arg=führt,pos=0.6]{Bank}{Konto}

\umlinherit{Girokonto}{Konto}
\umlinherit{Sparkonto}{Konto}

\umlclass[right=2cm of Konto]{Besitzer}{
- name\\
- kundennumer}{}

\umlassoc[arg=besitzer,pos=0.6]{Besitzer}{Konto}

\end{tikzpicture}
\end{bAntwort}

%%
% (b)
%%

\item Geben Sie für alle nicht abstrakten Klassen benutzerdefinierte
Konstruktoren an mit Parametern zur Initialisierung der folgenden Werte:
der Name einer Bank, die Kontonummer, der Kontostand, der Besitzer und
der Zinssatz (bzw. Kreditrahmen und Jahresgebühr) eines Sparkontos (bzw.
Girokontos), der Name und die Kundennummer eines Kontobesitzers.

Ergänzen Sie die Klassen um Methoden für die folgenden Aufgaben! Nutzen
Sie wann immer möglich das Vererbungskonzept aus und verwenden Sie ggf.
abstrakte (bzw. virtuelle) Methoden!

\TmpHinweis{Achtung: Ergänzen Sie ggf. alle benötigten Getter und Setter
in den beteiligten Klassen!}

\begin{bAntwort}
Konstruktoren ergänzen:

Bemerkung: Auch eine abstrakte Klasse kann einen Konstruktor besitzen,
dieser kann nur nicht ausgeführt werden. In den abgeleiteten Klassen
kann dieser Super-Konstruktor aber verwendet werden.
\end{bAntwort}

%%
% (c)
%%

\item Auf ein Konto soll ein Betrag eingezahlt und ein Betrag abgehoben
werden können. Soll von einem Sparkonto ein Betrag abgehoben werden,
dann darf der Kontostand nicht negativ werden. Bei einer Abhebung von
einem Girokonto darf der Kreditrahmen nicht überzogen werden.

\begin{bAntwort}
Bemerkung: Die Methode \bJavaCode{einzahlen} ist in der Klasse \bJavaCode{Konto}
implementiert, da sie sich für Spar- und Girokonten nicht unterscheidet
im Gegensatz zur Methode \bJavaCode{abheben}, die in beiden Klassen
unterschiedlich implementiert ist. \TmpHinweis{Sie wird als abstrakte
Methode in der Klasse Konto angegeben, um ihre Implementierung
(Überschreiben) zu gewährleisten.} Kreditrahmen wird als negativer Wert
gespeichert. Die Methoden zum Abheben liefern zusätzlich zur Änderung
des Kontostandes eine Rückmeldung bezüglich Erfolg oder Misserfolg der
Abbuchung.
\end{bAntwort}

%%
% (d)
%%

\item Ein Konto kann eine Jahresabrechnung durchführen. Bei der
Jahresabrechnung eines Sparkontos wird der Zinsertrag gutgeschrieben,
bei der Jahresabrechnung eines Girokontos wird die Jahresgebühr
abgezogen (auch wenn dadurch der Kreditrahmen überzogen wird).

\begin{bAntwort}
Anmerkung: Im Folgenden nur noch Angabe der gesuchten Methoden, alle
vorherigen Implementierungen (Attribute, Konstruktoren, Methoden, s. o.)
wurden nicht nochmals aufgeführt.
\end{bAntwort}

%%
% (e)
%%

\item Eine Bank kann einen Jahresabschluss durchführen. Dieser bewirkt,
dass für jedes Konto der Bank eine Jahresabrechnung durchgeführt wird.

%%
% (f)
%%

\item Eine Bank kann ein Sparkonto eröffnen. Die Methode soll die
folgenden fünf Parameter haben: den Namen und die Kundennummer des
Kontobesitzers, die Kontonummer, den (anfänglichen) Kontostand und den
Zinssatz des Sparkontos. Alle Parameter sind als String-Objekte oder als
Werte eines Grunddatentyps zu übergeben! Das Sparkonto muss nach seiner
Eröffnung in den Kontenbestand der Bank aufgenommen sein.

\TmpHinweis{Hinweis: Falls der Kunde schon mit einem Konto in der Bank
geführt ist, können die Werte für das \bJavaCode{Besitzer}-Objekt übernommen
werden. Schreiben Sie daher eine Hilfsmethode \bJavaCode{Besitzer
schonVorhanden(String name, int kunr)}, die prüft, ob der Kunde mit
\bJavaCode{name} und \bJavaCode{kunr} schon in der Liste vorhanden ist und diesen
bzw. andernfalls einen neu erzeugten Besitzer zurückgibt.}

\TmpHinweis{Sinnvolle/notwendige Methoden der Klasse ArrayList für diese
Aufgabe:
\\
\bJavaCode{public int size()}: Returns the number of elements in this
list.
\\
\bJavaCode{public boolean isEmpty()}: Returns true if this list contains no
elements.
\\
\bJavaCode{public E get(int index)}: Returns the element at the specified
position in this list.
\\
\bJavaCode{public boolean add(E e)}: Appends the specified element to the end of this list.
\\
(siehe auch Java-Api: https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html)}

\begin{bAntwort}
\bJavaExamen{66112}{2002}{09}{Bank}
\bJavaExamen{66112}{2002}{09}{Konto}
\bJavaExamen{66112}{2002}{09}{Sparkonto}
\bJavaExamen{66112}{2002}{09}{Girokonto}
\bJavaExamen{66112}{2002}{09}{Besitzer}
\end{bAntwort}
\end{enumerate}

\end{document}
