{"id":55000734,"date":"2010-08-01T00:00:00","date_gmt":"2020-05-22T22:06:47","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=734"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Schnittstellenvererbung","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Schnittstellenvererbung\/","title":{"rendered":"Schnittstellenvererbung"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/64416c8cd95d482a88498ebd114c871b\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Access-Entwickler sind nicht gerade verw&ouml;hnt, wenn es um objektorientierte Techniken unter VBA geht. Es gibt zwar die M&ouml;glichkeit, Klassen zu programmieren und Objekte auf Basis dieser Klassen zu erzeugen, aber Features wie Vererbung fallen weitgehend flach. Weitgehend Nun, zumindest die sogenannte Schnittstellenvererbung ist unter VBA m&ouml;glich. Damit k&ouml;nnen Sie immerhin mehrere Auspr&auml;gungen einer Klasse nach den Vorgaben einer Schnittstelle implementieren und diese je nach Bedarf austauschen.<\/b><\/p>\n<p>Bevor wir uns den technischen Feinheiten widmen, schauen wir uns erstmal den Sinn und Zweck der Schnittstellenvererbung an. Es gibt Anforderungen, die sehr &auml;hnliche Vorg&auml;nge mit verschiedenen Techniken umsetzen. Ein Beispiel daf&uuml;r ist das Versenden von E-Mails: Sie k&ouml;nnen dazu Outlook fernsteuern oder alternativ eine der vielen Klassen zum direkten Versenden von E-Mails via Winsock und SMTP einsetzen. F&uuml;r Ihre Anwendung ist das Ziel immer gleich: Die E-Mail soll beim Empf&auml;nger ankommen und daf&uuml;r stellen wir ein Paket aus Informationen wie Empf&auml;nger, Absender, Betreff und Inhalt der E-Mail zusammen. Der Rest interessiert uns nicht &#8211; dies sollen entsprechende Prozeduren erledigen.<\/p>\n<p>Ein &auml;hnliches Beispiel ist die Ausgabe von Daten. Diese sollen einmal in einem Bericht landen, ein anderes Mal in einem Word-Dokument, vielleicht aber auch einfach in einer Textdatei, in einem HTML- oder XML-Dokument oder als schlichte Ausgabe im Direktfenster des VBA-Editors.<\/p>\n<p>Auch hier haben wir wenig Lust, uns darum zu k&uuml;mmern, wie der Inhalt im entsprechenden Ausgabeformat landet &#8211; wir m&ouml;chten h&ouml;chstens festlegen, welches Ausgabeformat verwendet wird und gegebenenfalls die dorthin geschickten Daten filtern oder sortieren.<\/p>\n<p>Dies alles ist mit herk&ouml;mmlichen Prozeduren m&ouml;glich. Im Falle der E-Mails w&uuml;rden Sie die Daten wie Absender, Empf&auml;nger, Betreff und Text etwa per Formular abfragen und dann die Prozedur zum Versenden der E-Mail aufrufen.<\/p>\n<p>Diese entscheidet dann auf Basis vorher festgelegter Kriterien, ob die E-Mail mit Outlook oder direkt per SMTP verschickt wird, und steuert den entsprechenden Zweig einer <b>If&#8230;Then<\/b>&#8211; oder <b>Select Case<\/b>-Bedingung an. In den verschiedenen Zweigen steckt dann versandspezifischer Code oder schlicht ein Aufruf einer Funktion, welche den Versand auf die angegebene Weise durchf&uuml;hrt.<\/p>\n<p>Sie w&uuml;rden dann beispielsweise zwei Funktionen definieren, deren Prozedurk&ouml;pfe etwa so aussehen:<\/p>\n<pre>Public Function MailToOutlook(strSender As String, strRecipient As String, strSubject As String, strBody As String)\r\n    Public Function MailToSMTP(strSender As String, strRecipient As String, strSubject As String, strBody As String)<\/pre>\n<p>Die aufrufende Prozedur enthielte dann beispielsweise den folgenden Code:<\/p>\n<pre>Select Case strVersandart\r\n    Case &quot;Outlook&quot;\r\n        Call MailToOutlook (...)\r\n    Case &quot;SMTP&quot;\r\n        Call MailToSMTP (...)\r\nEnd Select<\/pre>\n<p>Sie haben hier alle Freiheiten: Die Funktionen <b>MailToOutlook <\/b>oder <b>MailToSMTP <\/b>k&ouml;nnten beispielsweise auch zus&auml;tzliche Parameter verwenden, oder Sie erweitern das <b>Select Case<\/b>-Statement um eine dritte Methode zum Versenden von E-Mails.<\/p>\n<p><b>Klasse Funktion<\/b><\/p>\n<p>Die Funktionen zum Versenden von E-Mails k&ouml;nnten auch in zwei Klassen ausgelagert werden. Die Klasse zum Versenden von E-Mails via SMTP k&ouml;nnte beispielsweise wie in Listing 1 aussehen. Die Klasse f&uuml;r den Versand mit Outlook sieht genauso aus, nur dass die Methode zum Versenden der E-Mail den Namen <b>SendSMTPMail <\/b>besitzt.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Klasse zum Versenden von E-Mails via SMTP<\/p>\n<pre>Private m_Sender As String\r\nPrivate m_Recipient As String\r\nPrivate m_Subject As String\r\nPrivate m_Body As String\r\nPublic Property Let Sender(strSender As String)\r\n    m_Sender = strSender\r\nEnd Property\r\nPublic Property Let Recipient(strRecipient As String)\r\n    m_Recipient = strRecipient\r\nEnd Property\r\nPublic Property Let Subject(strSubject As String)\r\n    m_Subject = strSubject\r\nEnd Property\r\nPublic Property Let Body(strBody As String)\r\n    m_Body = strBody\r\nEnd Property\r\nPublic Function SendSMTPMail() As Boolean\r\n    ''... Code zum Senden der Mail per SMTP\r\n    SendSMTPMail = True\r\nEnd Function<\/pre>\n<p>Eine Prozedur, welche eine dieser beiden Klassen aufruft, sieht etwa wie in <a href=\"#anker-anchor\">Listing 2<\/a> aus. Sie bekommt per Parameter den Versender, den Empf&auml;nger, den Betreff und den Inhalt sowie die Versandart &uuml;bermittelt. Mit diesen Informationen entscheidet die <b>Select Case<\/b>-Bedingung, welcher der beiden Zweige angesteuert werden soll.<\/p>\n<p class=\"listingueberschrift\">Listing 2: Instanzierung der Klassen zum Versenden von E-Mails und Versenden der E-Mail<\/p>\n<pre>Public Sub MailVersenden(strAbsender As String, strEmpfaenger As String, strBetreff As String, strInhalt As String, strVersandart As String)\r\n    Dim objSendSMTPMail As clsSendSMTPMail\r\n    Dim objSendOutlookMail As clsSendOutlookMail\r\n    Select Case strVersandart\r\n        Case &quot;SMTP&quot;\r\n            Set objSendSMTPMail = New clsSendSMTPMail\r\n            With objSendSMTPMail\r\n                .Sender = strAbsender\r\n                .Recipient = strEmpfaenger\r\n                .Subject = strBetreff\r\n                .Body = strInhalt\r\n                If .SendSMTPMail = True Then\r\n                    MsgBox &quot;Versand via SMTP erfolgreich!&quot;\r\n                End If\r\n            End With\r\n        Case &quot;Outlook&quot;\r\n            Set objSendOutlookMail = New clsSendOutlookMail\r\n            With objSendOutlookMail\r\n                .Sender = strAbsender\r\n                .Recipient = strEmpfaenger\r\n                .Subject = strBetreff\r\n                .Body = strInhalt\r\n                If .SendOutlookMail = True Then\r\n                    MsgBox &quot;Versand via Outlook erfolgreich!&quot;\r\n                End If\r\n            End With\r\n    End Select\r\nEnd Sub<\/pre>\n<p>Dadurch wird eine der beiden Klassen <b>clsSendSMTPMail <\/b>und <b>clsSendOutlookMail <\/b>instanziert. Danach f&uuml;llt die Prozedur die Eigenschaften des auf diese Weise erzeugten Objekts und initiiert den Mailversand durch den Aufruf der Methode <b>SendSMTPMail <\/b>beziehungsweise <b>SendOutlookMail<\/b>.<\/p>\n<p><b>Enge Kopplung<\/b><\/p>\n<p>Die aufrufende Klasse ist dann allerdings sehr eng an die aufgerufenen Klassen gekoppelt. Wenn Sie die aufgerufenen Klassen so gestalten k&ouml;nnen, dass diese alle eine einheitliche Schnittstelle bieten &#8211; das hei&szlig;t, dass jede Klasse die gleichen Methoden und Eigenschaften enth&auml;lt -, k&ouml;nnen Sie eine abstrakte Schnittstelle f&uuml;r diese Klassen erstellen. Diese Schnittstelle fungiert dabei als eine Art &#8222;Vertrag&#8220; &#8211; sie legt genau fest, wie die Implementierung der Klasse aussehen muss.<\/p>\n<p><!--30percent--><\/p>\n<p><b>Klasse als Schnittstelle<\/b><\/p>\n<p>Diese Schnittstelle ist eine eigene Klasse, die alle enthaltenen Methoden und Eigenschaften festlegt, aber keine Implementierungsdetails enth&auml;lt. <\/p>\n<p>Sie sagt also beispielsweise: Die Klasse, die meine Schnittstelle implementiert, muss vier &ouml;ffentliche <b>Property Let<\/b>-Parameter namens <b>strSender<\/b>, <b>strRecipient<\/b>, <b>strSubject <\/b>und <b>strBody <\/b>mit dem Datentyp <b>String <\/b>und eine &ouml;ffentliche <b>Sub<\/b>-Methode namens <b>Send <\/b>aufweisen &#8211; nicht mehr und nicht weniger.<\/p>\n<p>Die Implementierung dieser Methoden und Eigenschaften folgt erst in den eigentlichen Klassen.<\/p>\n<p>Die Implementierung enth&auml;lt die eigentliche Funktionalit&auml;t. Um sicherzustellen, dass die in der Schnittstelle vorgegebene Definition eingehalten wird, enth&auml;lt diese Klasse die Anweisung <b>Implements ISendMail<\/b>. Die implementierten Methoden und Eigenschaften weisen eine spezielle Notation auf: Diese besteht aus dem Namen der zu implementierenden Schnittstelle, einem Unterstrich (_) und dem in der Schnittstellendefinition festgelegten Methoden- oder Eigenschaftsnamen.<\/p>\n<p><b>Von der Klasse zur Schnittstelle<\/b><\/p>\n<p>Wenn Sie bereits eine Klasse verwenden, welche die Eigenschaften und Methoden der geplanten Schnittstelle enth&auml;lt, k&ouml;nnen Sie daraus ganz einfach die Schnittstelle erstellen: Werfen Sie einfach jede Codezeile mit Ausnahme von <b>Option Explicit <\/b>und gegebenenfalls <b>Option Database <\/b>sowie der eigentlichen Ger&uuml;ste der &ouml;ffentlichen Methoden und Eigenschaften raus. Wenn Sie die Klasse aus <a href=\"#anker-12-anchor\">Listing 1<\/a> derart bearbeiten, bleibt der in <a href=\"#anker-11-anchor\">Listing 3<\/a> dargestellte Rest. Diese Klasse speichern Sie unter dem Namen <b>ISendMail<\/b>. Das <b>I <\/b>steht f&uuml;r <b>Interface<\/b>, also <b>Schnittstelle<\/b>, und deutet darauf hin, dass diese Klasse nur die Schnittstellenbeschreibung und keinerlei Implementierung irgendwelcher Funktionen enth&auml;lt.<\/p>\n<p class=\"listingueberschrift\">Listing 3: Definition der Schnittstelle f&uuml;r die Klassen zum Versenden von E-Mails<\/p>\n<pre>Option Compare Database\r\nOption Explicit\r\nPublic Property Let Sender(strSender As String)\r\nEnd Property\r\nPublic Property Let Recipient(strRecipient As String)\r\nEnd Property\r\nPublic Property Let Subject(strSubject As String)\r\nEnd Property\r\nPublic Property Let Body(strBody As String)\r\nEnd Property\r\nPublic Function SendMail() As Boolean\r\nEnd Function<\/pre>\n<p>Der einzige Unterschied in der Deklaration der Prozedurk&ouml;pfe ist der, dass wir die Function-Prozedur <b>SendSMTPMail <\/b>in <b>SendMail <\/b>umbenannt haben. Der Grund ist klar: Die Schnittstelle soll sp&auml;ter stellvertretend f&uuml;r beide vorhandenen oder sogar f&uuml;r noch weitere Klassen verwendet werden und deshalb neutrale, von der verwendeten Methode unabh&auml;ngige Bezeichnungen aufweisen.<\/p>\n<p><b>Anpassen der Implementierungen<\/b><\/p>\n<p>Damit wir die beiden Klassen <b>clsSendOutlookMail <\/b>und <b>clsSendSMTPMail <\/b>sp&auml;ter als Implementierung nutzen k&ouml;nnen, m&uuml;ssen wir diesen mitteilen, dass sie die Schnittstelle <b>ISendMail <\/b>implementieren.<\/p>\n<p>Wenn Sie dies mit einer vorhandenen Klasse durchf&uuml;hren, brauchen Sie dieser zun&auml;chst nur die folgende Zeile im Kopf des Moduls hinzuzuf&uuml;gen:<\/p>\n<pre>Implements ISendMail<\/pre>\n<p>Um zu pr&uuml;fen, ob die Klasse alle in der Schnittstelle vorgegebenen Elemente implementiert, brauchen Sie nur das Projekt zu kompilieren (VBA-Editor, Men&uuml;eintrag <b>Debuggen|Kompilieren von &lt;Projektname&gt;<\/b>). Das Ergebnis des ersten Anlaufs sehen Sie in Bild 1. Die Implementierung der <b>Property<\/b>-Prozedur <b>Sender <\/b>ist nicht in Ordnung. Die L&ouml;sung ist einfach: Alle Elemente der Implementierungen einer Schnittstelle m&uuml;ssen mit dem Namen der Schnittstellenklasse und einem Unterstrich beginnen, also beispielsweise <b>ISendMail_Sender <\/b>statt einfach nur <b>Sender<\/b>. <\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_04\/Schnittstellen_5-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Wenn nicht alle in der Schnittstelle definierten Elemente implementiert sind, meckert Access beim Kompilieren.<\/span><\/b><\/p>\n<p>Die vollst&auml;ndige Umwandlung der Klasse <b>clsSendSMTPMail <\/b>aus <a href=\"#anker-12-anchor\">Listing 1<\/a> in eine Implementierung der Klasse <b>ISendMail <\/b>sieht wie in <a href=\"#anker-17-anchor\">Listing 4<\/a> aus.<\/p>\n<p>Wenn Sie <b>clsSendSMTPMail<\/b> und <b>clsSendOutlookMail <\/b>wie in diesem Listing in eine Implementation von <b>ISendMail <\/b>umgewandelt haben, k&ouml;nnen Sie die Prozedur, die diese Klassen verwendet, wie in <a href=\"#anker-18-anchor\">Listing 5<\/a> anpassen.<\/p>\n<p class=\"listingueberschrift\">Listing 4: Die Implementierung der Schnittstelle ISendMail f&uuml;r das Versenden von E-Mails mit SMTP<\/p>\n<pre>Implements ISendMail\r\n''...Deklarationen\r\nPrivate Property Let ISendMail_Sender(strSender As String)\r\n    m_Sender = strSender\r\nEnd Property\r\nPrivate Property Let ISendMail_Recipient(strRecipient As String)\r\n    m_Recipient = strRecipient\r\nEnd Property\r\nPrivate Property Let ISendMail_Subject(strSubject As String)\r\n    m_Subject = strSubject\r\nEnd Property\r\nPrivate Property Let ISendMail_Body(strBody As String)\r\n    m_Body = strBody\r\nEnd Property\r\nPrivate Function ISendMail_SendMail() As Boolean\r\n    ''... Code zum Senden der Mail per SMTP\r\n    ISendMail_SendMail = True\r\nEnd Function<\/pre>\n<p><b>Lose Kopplung<\/b><\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;<\/p>\n<p>Die lose Kopplung zwischen der aufrufenden Klasse und der Implementierung der Schnittstelle erreichen Sie dadurch, dass nicht die konkrete aufzurufende Klasse deklariert wird, sondern nur die Schnittstelle (<b>Dim objSendMail As ISendMail<\/b>). Erst die Instanzierung legt konkret die zu verwendende Klasse fest (<b>Set objSendMail = clsSendSMTPMail <\/b>beziehungsweise <b>Set objSendMail = clsSendOutlookMail<\/b>).<\/p>\n<p>Sie k&ouml;nnen nun beliebige weitere Implementierungen der Schnittstelle erzeugen und diese nach Bedarf einsetzen. Der gro&szlig;e Vorteil dabei ist: Durch die Verwendung der Schnittstelle legen Sie exakt fest, was deren Implementierungen f&uuml;r Methoden und Eigenschaften anbieten &#8211; Sie k&ouml;nnen also in aufrufenden Routinen gegen diese Schnittstelle programmieren, ohne sich um die enthaltenen Details zu k&uuml;mmern.<\/p>\n<p>Wenn Sie die Implementierungen dieser Schnittstelle wie in <a href=\"#anker-18-anchor\">Listing 5<\/a> verwenden, brauchen Sie zum Hinzuf&uuml;gen einer weiteren Implementierung nur zwei Zeilen hinzuzuf&uuml;gen, und zum Entfernen einer Implementierung brauchen Sie lediglich zwei Zeilen zu entfernen.<\/p>\n<p>Listing 5: Wahlweiser Aufruf zweier Implementierungen der gleichen Schnittstelle<\/p>\n<pre>Public Sub MailVersenden(strAbsender As String, strEmpfaenger As String, strBetreff As String, strInhalt As String, strVersandart As String)\r\n    Dim objSendMail As ISendMail\r\n    Select Case strVersandart\r\n        Case &quot;SMTP&quot;\r\n            Set objSendMail = New clsSendSMTPMail\r\n        Case &quot;Outlook&quot;\r\n            Set objSendMail = New clsSendOutlookMail\r\n    End Select\r\n    With objSendMail\r\n        .Sender = strAbsender\r\n        .Recipient = strEmpfaenger\r\n        .Subject = strBetreff\r\n        .Body = strInhalt\r\n        If .SendMail = True Then\r\n            MsgBox &quot;Versand erfolgreich!&quot;\r\n        End If\r\n    End With\r\nEnd Sub<\/pre>\n<p><b>Syntax von Schnittstellen im &Uuml;berblick<\/b><\/p>\n<p>Schnittstellen erhalten einen Klassennamen, der mit dem gro&szlig;geschriebenen Buchstaben <b>I <\/b>beginnt.<\/p>\n<p>Schnittstellen enthalten die Deklaration von <b>Sub<\/b>&#8211; und <b>Function<\/b>&#8211; sowie von <b>Property Let<\/b>\/<b>Get<\/b>\/<b>Set<\/b>-Prozeduren, wobei alle Elemente &ouml;ffentlich deklariert sind.<\/p>\n<p>Klassen, die eine oder mehrere Schnittstellen implementieren, erhalten einen beliebigen Namen. Sie m&uuml;ssen allerdings im Kopf die <b>Implements<\/b>-Anweisung enthalten, um festzulegen, welche Schnittstelle implementiert werden soll. Als Argument dieser Anweisung wird der Name der Schnittstellenklasse angegeben:<\/p>\n<pre>Implements &lt;Name der Schnittstelle&gt;<\/pre>\n<p>Zu implementierende Methoden und Eigen-schaften werden privat deklariert. Ihre Namen bestehen aus dem Namen der Schnittstelle, dem Unterstrich und dem Namen der Methode oder der Eigenschaft:<\/p>\n<pre>Private Sub &lt;Schnittstellen&gt;_&lt;Routine&gt;(&lt;Parameter&gt;) As &lt;Typ&gt;\r\nPrivate Function &lt;Schnittstellen&gt;_&lt;Routine&gt;(&lt;Parameter&gt;) As &lt;Typ&gt;\r\nPrivate Property Get &lt;Schnittstellen&gt;_&lt;Routine&gt;() As &lt;Typ&gt;\r\nPrivate Property Let|Set &lt;Schnittstellen&gt;_&lt;Routine&gt;(&lt;Parameter&gt;)<\/pre>\n<p>Die Deklaration erfolgt &uuml;ber die Schnittstellenklasse:<\/p>\n<pre>Dim objSendMail As ISendMail<\/pre>\n<p>Die Instanzierung hingegen erfolgt &uuml;ber die konkrete Implementierung, in diesem Fall so:<\/p>\n<pre>Set objSendMail = clsSendOutlookMail<\/pre>\n<p>oder<\/p>\n<pre>Set objSendMail = clsSendSMTPMail<\/pre>\n<p>Beim Implementieren der Schnittstelle in einer konkreten Klasse unterst&uuml;tzt der VBA-Editor Sie &uuml;brigens. Sie k&ouml;nnen n&auml;mlich nach Auswahl des Namens der Schnittstellenklasse im linken Kombinationsfeld des Codefensters bequem alle Elemente &uuml;ber das rechte Kombinationsfeld hinzuf&uuml;gen (s. Bild 2). Das ist nicht viel, aber besser, als die Deklarationen der Elemente von Hand einzutragen. Moderne Entwicklungsumgebungen wie Visual Studio 2010 f&uuml;gen nach Eingabe der Implements-Anweisung &uuml;brigens alle Element automatisch hinzu &#8211; immerhin ist von vornherein klar, dass alle Elemente ben&ouml;tigt werden, um sp&auml;tere Kompilierfehler zu vermeiden.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_04\/Schnittstellen_5-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Die Kombinationsfelder des Codefensters helfen bei der Implementierung der Elemente einer Schnittstelle.<\/span><\/b><\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Wenn Sie eine Anforderung haben, deren Abarbeitung auf verschiedene Arten durchgef&uuml;hrt werden kann, die aber dennoch die gleichen Parameter erwartet, ist dies ein toller Ansatz: Sie kennen so erstens genau die Anforderungen an die Implementierung, weil deren Schnittstelle genau definiert ist. Wenn Sie eine neue Implementierung hinzuf&uuml;gen m&ouml;chten, brauchen Sie nur die neue Klasse zu erstellen und zwei Zeilen zum entsprechenden <b>Select Case<\/b>&#8211; oder <b>If&#8230;Then<\/b>-Konstrukt hinzuzuf&uuml;gen, welches die <b>Interface<\/b>-Klasse mit der konkreten Implementierung versieht.<\/p>\n<p>Das hier vorgestellte Beispiel ist zwar schon ziemlich konkret, allerdings fehlt hier echter Code &#8211; schlie&szlig;lich melden die Klassen nur, dass ihre <b>Senden<\/b>-Methode aufgerufen wurde, aber es geschieht sonst nichts weiter.<\/p>\n<p>Ein konkretes Beispiel finden Sie jedoch im Beitrag <b>Tabellen und Felder dokumentieren <\/b>(<b>www.access-im-unternehmen.de\/738<\/b>). Diese L&ouml;sung enth&auml;lt verschiedene M&ouml;glichkeiten, die Informationen &uuml;ber Tabellen, Felder, Indizes und Beziehungen zu exportieren: In das Direktfenster, in ein Word-Dokument, in ein HTML-Dokument et cetera. Schauen Sie sich diesen Beitrag an, wenn Sie das hier vorgestellte Konzept anhand eines echten Beispiels nachvollziehen m&ouml;chten.<\/p>\n<p>In einem weiteren Beitrag namens <b>Das Factory-Pattern <\/b>(<b>www.access-im-unternehmen.de\/735<\/b>) f&uuml;hren wir diese Technik noch ein St&uuml;ckchen weiter: Wir zeigen Ihnen, wie Sie die verschiedenen Implementierungen einsetzen, ohne den Code, der mit der entsprechenden Instanz arbeitet, &uuml;berhaupt noch anpassen zu m&uuml;ssen.<\/p>\n<p>Dazu lagern wir dort die Instanzierung in eine weitere Klasse aus &#8211; aber lesen Sie doch einfach den kompletten Beitrag zu diesem Thema.<\/p>\n<p>Hin und wieder hat sich die Verwendung von Schnittstellen als instabil erwiesen. In diesem Fall k&ouml;nnen Sie die Klassenvariable auch einfach als Object deklarieren.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Schnittstellen.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{C509186F-D4B0-4F98-8A50-2F792D010BA3}\/aiu_734.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Access-Entwickler sind nicht gerade verw&ouml;hnt, wenn es um objektorientierte Techniken unter VBA geht. Es gibt zwar die M&ouml;glichkeit, Klassen zu programmieren und Objekte auf Basis dieser Klassen zu erzeugen, aber Features wie Vererbung fallen weitgehend flach. Weitgehend Nun, zumindest die sogenannte Schnittstellenvererbung ist unter VBA m&ouml;glich. Damit k&ouml;nnen Sie immerhin mehrere Auspr&auml;gungen einer Klasse nach den Vorgaben einer Schnittstelle implementieren und diese je nach Bedarf austauschen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662010,66042010,44000025],"tags":[],"class_list":["post-55000734","post","type-post","status-publish","format-standard","hentry","category-662010","category-66042010","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Schnittstellenvererbung - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Schnittstellenvererbung\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Schnittstellenvererbung\" \/>\n<meta property=\"og:description\" content=\"Access-Entwickler sind nicht gerade verw&ouml;hnt, wenn es um objektorientierte Techniken unter VBA geht. Es gibt zwar die M&ouml;glichkeit, Klassen zu programmieren und Objekte auf Basis dieser Klassen zu erzeugen, aber Features wie Vererbung fallen weitgehend flach. Weitgehend Nun, zumindest die sogenannte Schnittstellenvererbung ist unter VBA m&ouml;glich. Damit k&ouml;nnen Sie immerhin mehrere Auspr&auml;gungen einer Klasse nach den Vorgaben einer Schnittstelle implementieren und diese je nach Bedarf austauschen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Schnittstellenvererbung\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:06:47+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg08.met.vgwort.de\/na\/64416c8cd95d482a88498ebd114c871b\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"12\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnittstellenvererbung\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnittstellenvererbung\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Schnittstellenvererbung\",\"datePublished\":\"2020-05-22T22:06:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnittstellenvererbung\\\/\"},\"wordCount\":1904,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnittstellenvererbung\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/64416c8cd95d482a88498ebd114c871b\",\"articleSection\":[\"2010\",\"4\\\/2010\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnittstellenvererbung\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnittstellenvererbung\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnittstellenvererbung\\\/\",\"name\":\"Schnittstellenvererbung - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnittstellenvererbung\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnittstellenvererbung\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/64416c8cd95d482a88498ebd114c871b\",\"datePublished\":\"2020-05-22T22:06:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnittstellenvererbung\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnittstellenvererbung\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnittstellenvererbung\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/64416c8cd95d482a88498ebd114c871b\",\"contentUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/64416c8cd95d482a88498ebd114c871b\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnittstellenvererbung\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Schnittstellenvererbung\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Schnittstellenvererbung - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Schnittstellenvererbung\/","og_locale":"de_DE","og_type":"article","og_title":"Schnittstellenvererbung","og_description":"Access-Entwickler sind nicht gerade verw&ouml;hnt, wenn es um objektorientierte Techniken unter VBA geht. Es gibt zwar die M&ouml;glichkeit, Klassen zu programmieren und Objekte auf Basis dieser Klassen zu erzeugen, aber Features wie Vererbung fallen weitgehend flach. Weitgehend Nun, zumindest die sogenannte Schnittstellenvererbung ist unter VBA m&ouml;glich. Damit k&ouml;nnen Sie immerhin mehrere Auspr&auml;gungen einer Klasse nach den Vorgaben einer Schnittstelle implementieren und diese je nach Bedarf austauschen.","og_url":"https:\/\/access-im-unternehmen.de\/Schnittstellenvererbung\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:06:47+00:00","og_image":[{"url":"http:\/\/vg08.met.vgwort.de\/na\/64416c8cd95d482a88498ebd114c871b","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"12\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Schnittstellenvererbung\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Schnittstellenvererbung\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Schnittstellenvererbung","datePublished":"2020-05-22T22:06:47+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Schnittstellenvererbung\/"},"wordCount":1904,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Schnittstellenvererbung\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/64416c8cd95d482a88498ebd114c871b","articleSection":["2010","4\/2010","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Schnittstellenvererbung\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Schnittstellenvererbung\/","url":"https:\/\/access-im-unternehmen.de\/Schnittstellenvererbung\/","name":"Schnittstellenvererbung - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Schnittstellenvererbung\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Schnittstellenvererbung\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/64416c8cd95d482a88498ebd114c871b","datePublished":"2020-05-22T22:06:47+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Schnittstellenvererbung\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Schnittstellenvererbung\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Schnittstellenvererbung\/#primaryimage","url":"http:\/\/vg08.met.vgwort.de\/na\/64416c8cd95d482a88498ebd114c871b","contentUrl":"http:\/\/vg08.met.vgwort.de\/na\/64416c8cd95d482a88498ebd114c871b"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Schnittstellenvererbung\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Schnittstellenvererbung"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000734","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000734"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000734\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000734"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000734"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000734"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}