Vererbung mit Interfaces

This commit is contained in:
Marco Ammon 2020-06-26 10:29:44 +02:00
parent 8ad2433d0d
commit b23c701932
2 changed files with 40 additions and 5 deletions

Binary file not shown.

View File

@ -168,11 +168,46 @@
\end{itemize} \end{itemize}
\end{itemize} \end{itemize}
\subsection{Interfaces} \subsection{Vererbung mit Interfaces}
\begin{itemize}
\subsubsection{Dynamischer Methodenaufruf} \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}
\subsubsection{Casts/Typprüfung zur Laufzeit} \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} \subsection{Mehrfachvererbung}