\documentclass{bschlangaul-aufgabe}
\bLadePakete{java,uml}
\begin{document}
\bAufgabenMetadaten{
  Titel = {Aufgabe 1},
  Thematik = {UML-Diagramme entspreched Java-Code zeichnen},
  Referenz = 66116-2018-F.T2-TA2-A1,
  RelativerPfad = Examen/66116/2018/03/Thema-2/Teilaufgabe-2/Aufgabe-1.tex,
  ZitatSchluessel = examen:66116:2018:03,
  ZitatBeschreibung = {Seite 15-16},
  BearbeitungsStand = mit Lösung,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {Vererbung, Interface, Abstrakte Klasse, Klassendiagramm, Objektdiagramm, Sequenzdiagramm},
  EinzelpruefungsNr = 66116,
  Jahr = 2018,
  Monat = 03,
  ThemaNr = 2,
  TeilaufgabeNr = 2,
  AufgabeNr = 1,
}

Gegeben sei das folgende Java-Programm:
\footcite[Seite 15-16]{examen:66116:2018:03}

\begin{bJavaAngabe}
class M {
  private boolean b;
  private F f;
  private A a;

  public void m() {
    f = new F();
    a = new A(f);
    b = true;
  }
}

class A {
  private R r;
  public A(I i) {
    r = i.createX();
  }
}

interface I {
  public X createX();
}

class F implements I {
  public X createX() {
    return new X(0, 0);
  }
}

abstract class R {
  protected int v;
}

class X extends R {
  private int v, w;
  public X(int v, int w) {
    this.v = v;
    this.w = w;
  }
}
\end{bJavaAngabe}

\begin{enumerate}

%%
% a)
%%

\item Das
Subtypprinzip\index{Vererbung}\index{Interface}\index{Abstrakte Klasse}
der objektorientierten Programmierung wird in obigem Programmcode
zweimal ausgenutzt. Erläutern Sie wo und wie dies geschieht.

%%
% b)
%%

\item Zeichnen Sie ein UML-Klassendiagramm\index{Klassendiagramm}, das
die statische Struktur des obigen Programms modelliert. Instanzvariablen
mit einem Klassentyp sollen durch gerichtete Assoziationen mit
Rollennamen und Multiplizität am gerichteten Assoziationsende modelliert
werden. Alle aus dem Programmcode ersichtlichen statischen Informationen
(insbesondere Interfaces, abstrakte Klassen, Zugriffsrechte,
benutzerdefinierte Konstruktoren und Methoden) sollen in dem
Klassendiagramm abgebildet werden.

\begin{bAntwort}
\begin{tikzpicture}
\umlclass[x=1,y=5]{M}{- boolean b}{+ m(): void}
\umlsimpleclass[x=0,y=2.5]{F}
\umlsimpleclass[x=5,y=5]{A}
\umlclass[x=7,y=2.5,type=abstract]{R}{\# int v}{}
\umlclass[x=3,y=0,type=interface]{I}{}{+ createX(): X}
\umlclass[x=8,y=0]{X}{- int v\\- int w}{}

\umluniassoc[mult=1]{A}{R}
\umluniassoc[mult=1]{M}{A}
\umluniassoc[mult=1]{M}{F}
\umluniassoc[mult=1]{I}{X}
\umldep[mult=1,pos=0.9]{A}{I}
\umlinherit{X}{R}
\umlreal{F}{I}
\end{tikzpicture}
\end{bAntwort}

%%
% c)
%%

\item Es wird angenommen, dass ein Objekt der Klasse \bJavaCode{M}
existiert, für das die Methode \bJavaCode{m()} aufgerufen wird. Geben
Sie ein Instanzendiagramm (Objektdiagramm)\index{Objektdiagramm} an, das
alle nach der Ausführung der Methode \bJavaCode{m} existierenden Objekte
und deren Verbindungen (Links) zeigt.

\begin{bAntwort}
\bMetaNochKeineLoesung
\end{bAntwort}

%%
% d)
%%

\item Wie in Teil c) werde angenommen, dass ein Objekt der Klasse M
existiert, für das die Methode \bJavaCode{m()} aufgerufen wird. Diese
Situation wird in Abb. 1 dargestellt. Zeichnen Sie ein
Sequenzdiagramm\index{Sequenzdiagramm}, das Abb. 1 so ergänzt, dass alle
auf den Aufruf der Methode \bJavaCode{m()} folgenden Objekterzeugungen und
Interaktionen gemäß der im Programmcode angegebenen Konstruktor- und
Methodenrümpfe dargestellt werden. Aktivierungsphasen von Objekten sind
durch längliche Rechtecke deutlich zu machen.

\begin{bAntwort}
\begin{tikzpicture}
\begin{umlseqdiag}
\umlobject[class=M]{m}
%,create text={new F()}
\umlcreatecall[class=F]{m}{f}
%,create text={new A(f)
\umlcreatecall[class=A]{m}{a}
\begin{umlcall}[op={createX()},return={:X}]{a}{f}
% ,create text={new X(0,0)
\umlcreatecall[class=X]{f}{x}
\end{umlcall}
\end{umlseqdiag}
\end{tikzpicture}
\end{bAntwort}
\end{enumerate}

\end{document}
