Vererbung zwischen den Klassen

  • Hallo zusammen


    Ich habe folgende Klassen:
    UIMultiLanguage
    mit Property Set und Get Title
    und Property Set und Get Prompt


    Dann eine Methode getMessage(), bei welcher eigentlich eine Messagebox mit den Properties angezeigt wird.


    Nun habe ich eine Klasse UIForm, bei welcher UIMultiLanguage vererbt wird. Dort will ich nun die Methode getMessage() aufrufen.
    Ich verändere dazu erst:
    UIMultiLanguage..Title="Titel"
    UIMultiLanguage..Prompt="Text zum Anzeigen"


    und dann rufe ich die mit:
    Call UIMultiLanguage..getMessage()
    die Funktion auf.


    Nun mache ich das ganze noch in einem:
    Forall Element in ArrrayField
    drin.


    Sobald er den Titel von UIMultiLanguage setzt, verliere ich in UIForm "Element"? Kann mir jemand weiterhelfen?


    Ist das überhaupt OO Konform wie ich das mache? Oder müsste ich UIMultiLanguage instanzieren und die Methode so ausführen (Dann funktionerts übrigens).


    Greets


    Nachtrag: Wenn ich in UIForm mit:
    Titel="Titel"
    Prompt="Text zum Anzeigen"
    Call getMessage()
    arbeite, dann funktionierts :-?

  • Okay, stark vereinfacht:


    ScriptLibrary ProUIMultiLanguage:

    Code
    Public Class ProUIMultiLanguage	Private cTitle As String	Private cPrompt As String	Property Set Title As String		Me.cTitle=Title	End Property	Property Set Prompt As String		Me.cPrompt=Prompt	End Property	Public Function getMessage() As Integer		getMessage=Msgbox(Me.cPrompt,,Me.cTitle)	End Function	End Clas


    ScriptLibrary ProUIForm, vererbt von MultiLanguage:

    Code
    Class ProUIForm As ProUIMultiLanguage	Sub new(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)		On Event queryReCalc From Source Call queryReCalc	End Sub	Private Sub queryReCalc(Source As Notesuidocument, Continue As Variant)		Dim arrFields(1) As String		arrFields(0)="Feld1"		arrFields(1)="Feld2"		Forall Element In arrFields			'Me.Title="Feldnamen"			'Me.Prompt="Feld Name: " & Element			'Call Me.getMessage()			ProUIMultiLanguage..Title="Feldnamen"			ProUIMultiLanguage..Prompt="Feld Name: " & Element			Call ProUIMultiLanguage..getMessage()		End Forall	End SubEnd Class


    Dann hab ich ein Form.
    Im Options Teil:

    Code
    Use "ProUIForm"


    Im Declarations:

    Code
    Dim p As ProUIForm


    Im QueryOpen:

    Code
    Set p=New ProUIForm(Source, Mode, IsNewDoc, Continue)


    Nun, wenn ich die Properties und den Auftruf mit "ProUIMultiLanguage.." dann verliert er "Element", wenn ich (wie mein remark) den auftruf mit Me.Title etc mache, dann funzt es.

  • habe mal ein bischen getestet.


    habe deinen code

    Code
    Forall Element In arrFields   ProUIMultiLanguage..Title="Feldnamen"   ProUIMultiLanguage..Prompt="Feld Name: " & Element   Call ProUIMultiLanguage..getMessage()End Forall


    so abgeändert


    Code
    Forall Element In arrFields
       Me.Title="Feldnamen"
       Me.Prompt="Feld Name: " & Element
       Call Me.getMessage()
    End Forall


    so hat er dann ELEMENT behalten.
    kannst generell auf die eigenschaft der subclass über ME zugreifen


    gruß hendrik

  • Kann das sein daß du in deinen Script Libraries die Option "Option Explicit" bzw "Option Declare" nicht verwendest ?


    Sonst hätte dir der Compiler die ProUIMultiLanguage angemeckert.


    Du kannst in der abgeleiteten Klasse entweder direkt auf die Member Variablen zugreifen oder eben über die Properties wie leth es schon angemerkt hat

  • taurec: Nein, ich hab Option Declare eingeschaltet, und der Compiler "meckert" da gar nichts rum. :)


    leth: Das hab ich ja geschrieben, dass es mit "Me.Title" geht. Die Frage ist, weshalb es mit "ProUIMultiLanguage..Title" nicht funktioniert. Diese Syntax passt mir nämlich besser, da ich dann auf einen Blick sehe welche Klasse ich verändere/aufrufe. Grundsätzlich könnte ich sogar Title="" schreiben, das funktioniert auch. Aber die Pflegbarkeit der Klasse leidet dann arg darunter.


    Bei anderen Klassen hab auch immer mit "ProUIMultiLanguage..Title" gearbeitet, und es hat immer funktioniert, eben ausser jetzt, wenn ich das in einem ForAll Loop drin mache, da verliert er irgendwie den Fokus...

  • Hi,


    wenn mich nicht alles täuscht, wirfst Du die Objekte hier durcheinander. Soweit ich weiss, sind Klassen die abgeleitet werden nur abstrakt. Du musst also mit Me referenzieren oder Du leitest eben nicht ab. So wie Du Deine abgeleitete Klasse geschrieben hast, könntest Du dir das Ableiten also auch sparen... ;)

  • Ja, also OO Technisch wird das nicht korrekt sein, was ich mache hab ich in der Zwischenzeit bemerkt. Ich müsste nämlich eine Utility Klasse machen für meine "getMessage" Funktion, und dann diese Utility Klasse instanzieren.


    Aber deine Aussage muss ich entkräften, ein Methoden Aufruf einer Übergeordneten Klasse kann ich mit Klassenname..Funktionsaufruf machen. Hab ich auch in entsprechenden OO Beispiel-Datenbanken so gesehen. ...oder du meinst etwas anderes.
    Ich kann ihn natürlich auch mit Me.Funktionsaufruf machen, oder mit Funktionsaufruf. Das steht mir alles frei. Ich machs eigentlich nur mit Klassenname..Funktionsaufruf weil ich damit einen besseren Überblick habe wo die Funktion herkommt. Aber eigentlich von der Klassen-Logik her wäre es wohl besser ein Me.Funktionsaufruf zu machen.
    Aber die Erfahrung kommt halt erst durch die Anwendung. :D

  • Zitat

    ...
    Aber deine Aussage muss ich entkräften, ein Methoden Aufruf einer Übergeordneten Klasse kann ich mit Klassenname..Funktionsaufruf machen. Hab ich auch in entsprechenden OO Beispiel-Datenbanken so gesehen. ...oder du meinst etwas anderes.


    *Das* habe ich auch nicht gesagt. :) Richtig, eine Methode eines übergeordneten Objektes kannst Du aufrufen, jedoch leitest Du hier eine Klasse von einer Anderen ab, was - soweit ich weiss - etwas Anderes ist. Die abgeleitete Klasse steht nach der Ableitung nämlich nicht zur Verfügung, sie dient quasi nur als Schablone für die neue Klasse und wenn Du anschliessend versuchst, die Schablone anzusprechen - wie Du es in Deinem Beispiel tust - kann das auch nicht funktionieren. ;)


    Zitat

    Ich kann ihn natürlich auch mit Me.Funktionsaufruf machen, oder mit Funktionsaufruf. Das steht mir alles frei. Ich machs eigentlich nur mit Klassenname..Funktionsaufruf weil ich damit einen besseren Überblick habe wo die Funktion herkommt. Aber eigentlich von der Klassen-Logik her wäre es wohl besser ein Me.Funktionsaufruf zu machen.


    Wenn es für Dich übersichtlicher ist, würde ich entweder einfach einen Funktionsblock vorschalten oder - wie Du selbst schon sagtest - eine "Utility" Klasse aufsetzen, wobei das IMO nicht unbedingt nötig wäre...

  • Hmm...also ich kann da nicht ganz folgen. Wie mach ich denn in LS keine Ableitung, sondern referenziere nur aufs übergeordnete??


    Ich hab glaub ich das ganze noch nicht ganz begriffen... :-?

  • Das sollte funktionieren...



    Hier wird allerdings nichts "vererbt", sondern lediglich ProUIMultilanguage als Objekt erzeugt. Wenn Du "vererben" möchtest, kommst Du um Me nicht herum, weil Du obwohl es sich um zwei Klassen handelt in Wirklichkeit aufgrund der Ableitung nur eine Klasse hast...