title image


Smiley Re: Gibt es in VB einen Unterschied zw. Klasse und Interface? Aber Ja!
Ein Interface ist ein Vertrag zwischen einem Client und einem Server.Der Client weiß in der Regel nichts über die Internas eines Servers, sondern nur, wie er über das Interface auf die Eingenschaften und Methoden eines Servers zugreifen kann.Wenn man in normaler Manier ein Klassenmodul erstellt, z.B. eine Klasse namens CHund und in dieser Klasse die öffentliche Eigenschaft Name und die öffentliche Methode Bellen erstellt: Dim msName as String  Public Property Get Name () As String Name = msName End Property  Public Property Let Name (ByVal NewName as String) msName = NewName End Property  Public Sub Bellen() MsgBox msName & " bellt." End SubUnd das ganze dann als DLL kompiliert, erstellt Visual Basic im Hintergrund ein Standard - Interface aus der Co-Klasse, indem es dem Klassennamen einen Unterstrich voranstellt:Interface _CHundAuf die Methoden von _CHund kann nun über IUnknown und über IDispatch zugegriffen werden.Wenn Du die DLL kompiliert hast, kanst Du mit dem Tool OLE-View die von VB erstellte Typelib öffnen und die Schnittstellendefinition bewundern.Möchte man nun ein eigenes Interface erstellen, so kann man das mit IDL (Interface Definition Language) erledigen. Die Quelldatei wird dann mit MIDL (Microsoft IDL Compiler) in eine Typelib kompiliert.Mit OLE-View kannst Du übrigens eine erstellte Typlelib öffnen, den Quelltext exportieren und meinetwegen mit MIDL erneut kompilieren.Die Erstellung von TypeLibs geschieht normalerweise für den VB-Programmierer nicht sichtbar im Hintergrund.Es gibt jedoch noch eine weitere Möglichkeit, Interfaces zu erstellen:Dazu erstellt man ein neues Klassenmodul und setzt die Instancing-Eigenschaft auf Public not creatable (es macht keinen Sinn, eine Instanz von einer Schnittstelle zu erstellen)Dieses Klassenmodul erhält dann alle Eingenschaftprozeduren und Methoden - jedoch ohne den Implementierungscode.Als Beispiel erstellen wir ein Interface namens ITier (Klassenmodul namens ITier erstellen) mit der Eigenschaft Name und der Methode LautGeben: Option Explicit  Public Property Get Name () As String End Property  Public Property Let Name (ByVal NewName as String) End Property  Public Sub LautGeben() End SubWie Du siehst, enthält dieses Klassenmodul lediglich die Funktionsdeklarationen und sonst nichts. Die Zeilen "End Property" und "End Sub" wären eigentlich überflüssig - jdoch der Compiler will es so.Unsere Klasse CHund soll nun die Schnittstelle ITier unterstützen ("Implementieren"):Option ExplicitImplements ITier Private msName As String Private Sub ITier_LautGeben() MsgBox msName & " bellt."End Sub Private Property Let ITier_Name(ByVal RHS As String) msName = RHSEnd Property Private Property Get ITier_Name() As String ITier_Name = msNameEnd PropertyBeachte bitte, daß dieses Klassenmodul keine öffentlichen Eigenschaften und Methoden bereitstellt. Würde man nun programmieren:Dim Hund As CHundSet Hund = New CHunddann würde man feststellen, daß die Klasse CHund keine Methoden hat. Da CHund keine Standardmethoden mehr hat (niemand hindert uns daran, welche zu erstellen), kann man auch nicht mehr über IDispatch (Automation) auf die Klasse zugreifen. Ab sofort ist der Zugriff ausschließlich über die Schnittstelle IHund möglich:Dim Hund As IHundSet Hund = New CHundHund.Name = "Hasso"Hund.LautGebenWas haben wir nun von dieser ganzen Arbeit?Nun, ich habe nicht ohne Grund die Methode Bellen() in LautGeben() umgetauft. Denn nun erstellen wir ein zweites Klassenmodul namens CKatze, daß ebenfalls die Schnittstelle ITier implementiert:Option ExplicitImplements ITier Private msName As String Private Sub ITier_LautGeben() MsgBox msName & " miaut."End Sub Private Property Let ITier_Name(ByVal RHS As String) msName = RHSEnd Property Private Property Get ITier_Name() As String ITier_Name = msNameEnd PropertyUnd nun können wir folgenden Client - Code schreiben:Option Explicit Private Sub Form_Load() Dim Tiere(2) As ITier, i As Integer  Set Tiere(0) = New CKatze Tiere(0).Name = "Minka"  Set Tiere(1) = New CHund Tiere(1).Name = "Hasso"  Set Tiere(2) = New CHund Tiere(2).Name = "Lassie"  For i = 0 To 2 Tiere(i).LautGeben Next  For i = 0 To 2 If TypeOf Tiere(i) Is CHund Then MsgBox "Tier Nr. " & i & " ist ein Hund namens " & Tiere(i).Name ElseIf TypeOf Tiere(i) Is CKatze Then MsgBox "Tier Nr. " & i & " ist eine Katze namens " & Tiere(i).Name Else MsgBox "Tier Nr. " & i & " ist ein unbekanntes Tier namens " & Tiere(i).Name End If NextEnd SubJetzt vertreiben wir unsere Applikation an mindestens 13517 Kunden.Irgendwann später einmal erweitern wir die Klasse CHund um die Fähigkeit, Hausschuhe zu holen. Da wir mittlerweile Clients vertrieben haben, die über die Schnittstelle ITier auf Hunde und Katzen zugreift, dürfen wir dieses Interface nicht mehr ändern (binäre Kompatibilität), denn sonst würden die alten Clients mit dem neuen Server nicht mehr zusammenarbeiten.Also erstellen wir ein neues Interface (richtig: Klassenmodul ! ) namens IWunderhund:Option Explicit Public Sub HoleHausschuhe()End SubDie vorhandene Klasse CHund erweitern wir um folgende Zeilen:Implements IWunderhund Private Sub IWunderhund_HoleHausschuhe() MsgBox msName & " holt Hausschuhe"End SubDer Rest bleibt unverändert.Den neuen Server können wir nun ausliefern, er unterstützt nach wie vor die alten Clients, denn wir haben an der Schnittstelle ITier nichts verändert.Wenn wir nun einen neuen Client schreiben, der die HoleHausschue Methode verwenden soll, dann schreiben wir:Dim Hund As ITierSet Hund = New CHundHund.Name = "Lassie"If TypeOf Hund Is IWunderhund Then ' Aha: der Server liegt in der neuen Version vor! Dim Wunderhund As IWunderhund Set Wunderhund = Hund Wunderhund.HoleHausschuheEnd IfWir haben nun eine Katze, die die Schnittstelle ITier implementiert ("Eine Katze ist ein Tier") und einen Hund, der die Schnittstellen ITier und IWunderhund implementiert ("Ein neuer Hund ist ein Tier und ein Wunderhund").Literatur:Ted Pattison: "COM- und MTS- Programmierung mit Visual Basic", Microsoft Press, ISBn 3-86063-497-6, 286 Seiten, Preis: 79,00 DMMicrosoft Corporation: "Verteilte Anwendungen mit Microsoft Visual Basic", MSCD Original Training, Microsoft Press, ISBN 3-86063-905-6, 533 Seiten, 119,00 DMGuy Eddon & Henry Eddon: "Inside Distributed COM", Microsoft Press, ISBN 3-86063-459-3, 584 Seiten, 98,00 DMAsh Rofail & Tony Martin: "Building N-Tier Applications with COM and Visual Basic 6.0", Wiley, ISBN 0-471-29549-3, US$ 49,99 (englisch)Viel Erfolg!Thomas Prötzschcu
Thomas Prötzsch

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: