Hallo Leutz,
folgendes Szenario:
Mal angenommen es existieren zwei Klassen Person und Mitarbeiter. Wobei die Mitarbeiter-Klasse von der Personen-Klasse erbt. Nun habe ich folgendes Problem. Wenn ich bei dem Mitarbeiter-Objekt die Methode save aufrufe, wird leider nicht die gleichnamige Methode der Superklasse (in diesem Fall Person) aufgerufen. Bei der Methode new hingegen funktioniert der automatische Aufruf der Methode in der Superklasse.
Hat jemand eine Lösung für das Problem.
Die Klassen:
Public Class Person
Private doc As NotesDocument
Private strVorname As String
Private strNachname As String
Sub new(doc As NotesDocument)
If Not doc Is Nothing Then
Set Me.doc = doc
Me.strVorname = doc.GetItemValue("vorname")(0)
Me.strNachname = doc.GetItemValue("nachname")(0)
End If
End Sub
Property Get Vorname As String
Vorname = Me.strVorname
End Property
Property Set Vorname As String
Me.strVorname = Vorname
End Property
Property Get Nachname As String
Nachname = Me.strNachname
End Property
Property Set Nachname As String
Me.strNachname = Nachname
End Property
Sub save
Call Me.doc.ReplaceItemValue("vorname", Me.Vorname)
Call Me.doc.ReplaceItemValue("nachname", Me.Nachname)
Call Me.doc.save(True,False,False)
End Sub
End Class
Public Class Mitarbeiter As Person
Private intPersonalnummer As Integer
Sub new(doc As NotesDocument)
If Not doc Is Nothing Then
Me.intPersonalnummer = Cint(doc.GetItemValue("personalnummer")(0))
End If
End Sub
Property Get Personalnummer As Integer
Personalnummer = Me.intPersonalnummer
End Property
Property Set Personalnummer As Integer
Me.intPersonalnummer = Personalnummer
End Property
Sub save
Call Me.doc.ReplaceItemValue("personalnummer", Me.Personalnummer)
Call Me.doc.save(True,False,False)
End Sub
End Class
Zum Testen habe ich den folgenden Agenten angelegt:
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim docMitarbeiter As NotesDocument
Set db = session.CurrentDatabase
Set docMitarbeiter = New NotesDocument(db)
docMitarbeiter.Form = "Mitarbeiter"
Call docMitarbeiter.ReplaceItemValue("vorname", "Max")
Call docMitarbeiter.ReplaceItemValue("nachname", "Mustermann")
Call docMitarbeiter.ReplaceItemValue("personalnummer", 1234)
Call docMitarbeiter.Save(True,False,False)
Dim ma As New Mitarbeiter(docMitarbeiter)
Print ma.Vorname 'Ausgabe: Max
Print ma.Nachname 'Ausgabe: Mustermann
Print ma.Personalnummer 'Ausgabe: 1234
ma.Vorname = "Maxi"
ma.Nachname = "Musterfrau"
ma.Personalnummer = 4321
Call ma.Save
Set ma = New Mitarbeiter(docMitarbeiter)
Print ma.Vorname 'Ausgabe: Max <------ kein Maxi
Print ma.Nachname 'Ausgabe: Mustermann <------ kein Musterfrau
Print ma.Personalnummer 'Ausgabe: 4321
End Sub
Guten morgen,
erstmal vielen Dank für die schnelle und sehr gute Hilfe. Irgendwie schäm ich mich nur ein bisschen, dass ich die Antwort (dotdot notation) nicht selbst in der Hilfe gefunden habe. Mehr zum Thema Klassen und LotusScript befindet sich in der Hilfe unter dem Inhaltspunkt: LotusScript Language -> User-Defined Data Types and Classes
Also die Lösung mit der dotdot notation sieht dann im obigen Beispiel wie folgt aus:
Public Class Mitarbeiter As Person
...
Sub save
Call Me.doc.ReplaceItemValue("personalnummer", Me.Personalnummer)
Person..save ' --> ruft die Methode der Save der Klasse Person auf
End Sub
...
End Class
Das ganze funktioniert genau so wie ich mir das vorgestellt habe und wie ich es aus meiner Zeit als Java-Entwickler kenne.
@Axel
Da gebe ich dir Recht, es ist natürlich nicht sinnvoll die reale Welt bis in das kleinste Detail abzubilden. Vielmehr lassen sich bestimmte Dinge (ob das nun Objekte der realen Welt oder eine Zusammenfassung von Funktionen sind, ist egal) sinnvoll in Klassen zusammenfassen. Die durch den richtigen Einsatz der objektorientierten Programmierung entstehenden Klassen-Hierarchien (Vererbung) und -Beziehungen unterstützen den Entwickler bei der Erstellung komplexer Anwendungen.