Benutzung von Interfaces in VBA

09/10/2007 - 12:03 von Stefan Hoffmann | Report spam
hi,

anlàsslich der AEK habe ich mich mal kurz mit Interfaces in VBA (Office)
beschàftigt, da ich vorher dafür keine Verwendung sah.

Interfaces sind in VBA Prototypen (laut OH) oder wie es in der MSDN
heißt Abstrakte Klassen.

Es handelst sich aber erstmal ja um echte Klassen. Also kann ich
folgendes machen:

Modul IMyIntf:
Option Compare Database
Option Explicit

Public Sub Foo()
End Sub

Modul TestMyIntf:
Option Compare Database
Option Explicit

Public Sub TestIMyIntf()

Dim i As IMyIntf

Set i = New IMyIntf
i.Foo()
Set i = Nothing

End Sub

Das ist natürlicht nicht gewollt. Laut eines klitzekleinen Hinweises in
der OH müßte eine Interface-Deklaration meiner Meinung nach so aussehen:

Modul IMyIntf:
Option Compare Database
Option Explicit

Private Const E_NOTIMPL As Long = &H80004001

Public Sub Foo()

Err.Raise E_NOTIMPL

End Sub

Private Sub Class_Initialize()

Err.Raise E_NOTIMPL

End Sub

Damit bekomme ich in obigem Testbeispiel eine entsprechende
Fehlermeldung, allerdings nur zur Laufzeit.

Fragen:
1. Gibt es Anwendungsfàlle, in denen ich den Prototypen instanzieren möchte?
2. Ist die generierte Fehlermeldung zur Laufzeit eher làstiger Overkill?


mfG

Access-FAQ http://www.donkarl.com/
KnowHow.mdb http://www.freeaccess.de
Newbie-Info http://www.doerbandt.de/Access/Newbie.htm
 

Lesen sie die antworten

#1 Stefan Dase
09/10/2007 - 12:48 | Warnen spam
Hallo Stefan,

anlàsslich der AEK habe ich mich mal kurz mit Interfaces in VBA (Office)
beschàftigt, da ich vorher dafür keine Verwendung sah.



Mir war es total neu, dass man Interfaces schon in VB(A) nutzen kann,
fand Pauls Vortrag aber extrem informativ und gut vorgetragen. Leider
war der Vormittag etwas zu kurz, um alle erwàhnten Punkte erlàutern zu
können.

Fragen:
1. Gibt es Anwendungsfàlle, in denen ich den Prototypen instanzieren
möchte?
2. Ist die generierte Fehlermeldung zur Laufzeit eher làstiger Overkill?



Obwohl ich kein OOP-Spezialist bin - unter VB(A) war das ja eher
rudimentàr verfügbar - denke ich, du gehst da von falschen
Voraussetzungen aus. Das Interface selber wird nie (!) instanziert; es
dient nur zur abstrakten Beschreibung der Eigenschaften und Methoden,
die eine Klasse zur Verfügung stellen muss, um diese Schnittstelle zu
implementieren. Es stellt logisch eher so eine Art Pflichtenheft dar.

Der entscheidende Punkt ist, dass du in der Entwicklung noch nicht
weißt, welches Objekt du übergeben bekommst. Mit der Schnittstelle
kannst du aber vorher genau festlegen, welche Methoden implementiert
werden müssen, und diese dann auch ansprechen.

Ein Anwendungsfall, den ich beim Vortrag im Kopf hatte, ist mein
selbsterstellter Fortschrittsdialog. Bisher erstelle ich immer eine
Instanz des Formulars und kann dann die öffentlichen Methoden auch per
Intellisense auswàhlen. Mit den Events wàre es schon wesentlich
eleganter, da es dann ggf. auch ohne Anzeige laufen würde. Die
Interface-Geschichte wàre dann der Königsweg.

Nachteilig ist nur, dass die gezeigten Wege nur innerhalb eines
Klassenmoduls verwendet werden können. Funktionen in Standardmodulen
müssen also irgendwie gekapselt werden.

Viele Grüße aus Bremen,
Stefan

Ähnliche fragen