diff --git a/verfahren.pdf b/verfahren.pdf index 6b8ebe5..0f9f924 100644 Binary files a/verfahren.pdf and b/verfahren.pdf differ diff --git a/verfahren.tex b/verfahren.tex index 2fe4cbb..08b5eb1 100644 --- a/verfahren.tex +++ b/verfahren.tex @@ -168,11 +168,46 @@ \end{itemize} \end{itemize} -\subsection{Interfaces} - -\subsubsection{Dynamischer Methodenaufruf} - -\subsubsection{Casts/Typprüfung zur Laufzeit} +\subsection{Vererbung mit Interfaces} +\begin{itemize} + \item Statische Bestimmung der V-Table-Indizes nicht mehr möglich + \item Pro Kombination aus Klasse \texttt{A} und Interface \texttt{I} wird eine Interface-V-Table \texttt{A:I} angelegt, in der Interface-Funktionen an statisch bekannten Indizes liegen:\begin{itemize} + \item Interface-V-Table enthält Verweis auf Klassendeskriptor von \texttt{A} + \item Da von Klasse implementierte Funktionen erwarten, dass \texttt{this} auf Objektbeginn zeigt, müssen Hilfsmethoden, die \texttt{this} korrigieren, erstellt und in die Interface-V-Table eingetragen werden + \end{itemize} + \item Objekt enthält \enquote{hinter} Attributen noch Verweise auf alle assoziierten Interface-V-Tables + \item Klassendeskriptor enthält Anzahl der von einer Klasse implementierten Interfaces sowie Verweis auf Interface-Tabelle der Klasse + \item Interface-Tabelle enthält Tripel aus (Offset, Verweis auf Interface-Deskriptor, Verweis auf Interface-V-Table) für alle von Klasse implementierten Interfaces: \begin{itemize} + \item Offset gibt Offset von Verweis auf jeweilige Interface-V-Table zum Anfang des Objekts an + \end{itemize} + \item Dynamischer Methodenaufruf falls statischer Typ Interface ist (sonst wie bei Einfachvererbung):\begin{enumerate} + \item Hilfsmethode mit statisch bekanntem Offset in der Interface-V-Table nachschlagen + \item Hilfsmethode verschiebt \texttt{this}-Zeiger um statisch bekannten Offset auf Objektanfang und ruft statisch bekannte, in \texttt{A} implementierte Methode auf + \end{enumerate} + \item Casts:\begin{itemize} + \item Klasse $\rightarrow$ Interface:\begin{enumerate} + \item Objektzeiger zu Klassendeskriptor zu Interface-Tabelle verfolgen + \item In Interface-Tabelle nach Eintrag für Interface suchen (ggf. komplettes Durchlaufen) + \item Im Erfolgsfall ist Cast gültig, sonst Laufzeitfehler + \item Referenz für neue Variable aus Objektanfang + zu Interface gehörigem Offset aus Interface-Tabelle bestimmen + \end{enumerate} + \item Interface $\rightarrow$ Klasse:\begin{enumerate} + \item Objektzeiger zu Interface-V-Table zu Klassendeskriptor verfolgen + \item Falls Klassendeskriptor nicht Zielklasse entspricht, Verfolgung zu Oberklasse(n) + \item Im Erfolgsfall ist Cast gültig, sonst Laufzeitfehler + \item Zeiger von Klassendeskriptor zu Interface-Tabelle verfolgen + \item In Interface-Tabelle Eintrag für Interface nachschlagen (garantiert vorhanden) + \item Referenz für neue Variable aus aktuellem Zeiger - zu Interface gehörigem Offset aus Interface-Tabelle bestimmen + \end{enumerate} + \end{itemize} + \item Interface mit Standardimplementierung:\begin{itemize} + \item Wird Standardimplementierung verwendet, muss der Objektzeiger beim Aufruf mit Interface als statischem Typ nicht korrigiert werden; allerdings ist Hilfsmethode anzulegen und in Klassen-V-Table einzutragen + \end{itemize} + \item Interface mit veränderlichem Zustand:\begin{itemize} + \item Implementierende Klassen erhalten Instanzvariablen des Interfaces als eigene Instanzvariablen + \item Interface hat implizite Getter-/Setter-Methjoden, die von Klasse implementiert werden + \end{itemize} +\end{itemize} \subsection{Mehrfachvererbung}