Vererbung mit Interfaces
This commit is contained in:
parent
8ad2433d0d
commit
b23c701932
BIN
verfahren.pdf
BIN
verfahren.pdf
Binary file not shown.
@ -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}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user