Seite 1 von 1

Methoden überladen [ERLEDIGT]

Verfasst: Mi, 09. Jun 2010 13:27
von Manfred
Jetzt habe ich mal wieder ein Dingen, was mich total verwirrt,

generell gilt doch, wenn ich in einer Superklasse eine Methode habe, dann wird die solange ausgeführt, bis ich in einer Klasse die von der Superklasse erbt eine Methode mit gleichen Namen habe. Sobald das der Fall ist, wird doch die Methode der Instanz ausgeführt? Und zwar gandenlos, oder? Und nicht mal so, oder mal so?

Irgendwas scheine ich falsch zu machen. Ich habe 3 Methoden, die ich einfach nur als Dummy in der Superklasse angelegt habe, aber davon werden 2 ausgeführt (trotz gleichnamiger in der Instanz) und die andere greift auf die überladene der Instanz zu.

Bevor ich jetzt Code einstelle, würde mich nur mal interessieren, ob ich das genauso richtig verstanden habe?

Re: Methoden überladen

Verfasst: Mi, 09. Jun 2010 13:30
von Tom
Im Prinzip ist das richtig so, aber es gibt meines Wissens Methoden, die sich nicht überladen lassen. Ansonsten kann XbpManfredBrowse z.B. ein eigenes :ForceStable haben, das etwas ganz anderes tut als das normale - das übrigens weiterhin zur Verfügung steht!

(Randbemerkung: Früher hießen kleine Programme, mit denen ich irgendwas ausprobiert habe, immer MURKS.PRG. Seit einer Weile heißen sie MANFRED.PRG :wink: )

Re: Methoden überladen

Verfasst: Mi, 09. Jun 2010 13:33
von Bertram Hansen
:lol: =D>

Re: Methoden überladen

Verfasst: Mi, 09. Jun 2010 13:36
von Manfred
Selbstgeschriebene Methoden lassen sich nicht überladen?
(Randbemerkung: Früher hießen kleine Programme, mit denen ich irgendwas ausprobiert habe, immer MURKS.PRG. Seit einer Weile heißen sie MANFRED.PRG :wink: )
Und welcher Teufel reitet Dich heute wieder?

@Bertram... wir sprechen uns noch :blob8: Die nächste Tafel Schokolade ißt Du alleine, da helfe ich Dir nicht mehr bei.

Re: Methoden überladen

Verfasst: Mi, 09. Jun 2010 13:38
von Tom

Code: Alles auswählen

CLASS ManfredBrowse FROM XbpBrowse
...
METHOD Init, ..., ForceStable

METHOD ManfredBrowse:ForceStable()
MsgBox('ForceStable')
::XbpBrowse:ForceStable() // ruft die Methode aus der Superklasse auf
* das würde zu einer Endlosrekursion führen:
* ::ForceStable()
RETURN self

Re: Methoden überladen

Verfasst: Mi, 09. Jun 2010 13:40
von Tom
Und welcher Teufel reitet Dich heute wieder?
Das hat überhaupt nichts Teuflisches. Ich habe irgendwann, als ich eine Deiner Fragen bearbeitet habe, das erste MANFRED.PRG gebaut, und irgendwie bin ich dann dabei geblieben. :wink: Ist also quasi eine Ehre.

Re: Methoden überladen

Verfasst: Mi, 09. Jun 2010 13:44
von Manfred
Öhm,

das Beispiel verstehe ich jetzt nicht im Zusammenhang mit meiner Frage. :-k

Re: Methoden überladen

Verfasst: Mi, 09. Jun 2010 13:47
von Tom
Die Antwort lautet: Ja, Du hast das richtig verstanden. Vermutlich machst Du also im Code irgendwas falsch.

Re: Methoden überladen

Verfasst: Mi, 09. Jun 2010 14:36
von Manfred
OK,

nächster Schritt:

Code: Alles auswählen

CLASS datenbank
      HIDDEN:
//----------------------------- Protected --------------------------------------
      PROTECTED:
      CLASS VAR aDb SHARED                                                      // kann durch SHARED von ALLEN anderen Instanzen für ALLE anderen Instanzen sichtbar verändert werden
      CLASS VAR oId SHARED                                                      // Test. ID werden ja eigentlich überall vergeben

      VAR aStrukturErweitert                                                    // hier können Zusatzfelder zur Struktur erfaßt werden für den späteren Gebrauch       .

      VAR cDbStrukturDatum,;                                                    // hier kommt das Datum der letzten gültigen Struktur für die jeweilige DB rein        .
          cIndexKeyDatum                                                        // hier kommt das Datum des letzten gültigen Indexschlüssels rein                      .

      VAR lMin1Record                                                           // wenn DB mindestens 1 Satz haben muß                                                                                   .

      CLASS METHOD initClass                                                    // wird nur beim 1.Mal gesetzt und dann nicht wieder neu initialisiert, bei weiteren Instanzen


      METHOD erzeugeStruktur
      METHOD erzeugeVerzeichnisse                                               // erzeugt Verzeichnisse, oder prüft auf Vorhandensein ab

      METHOD initstruktur
      METHOD initvaria

ENDCLASS
********************************************************************************
METHOD datenbank:initvaria()
RETURN self

METHOD datenbank:initstruktur()
RETURN self

METHOD datenbank:erzeugestruktur()
RETURN self
********************************************************************************
METHOD datenbank:INIT(oProgress)                                                // hier werden die Werte gesetzt, sobald eine Instanz gebildet wird (gilt für jede Instanz getrennt)
       ::initvaria()                             <------ das hier klappt
       ::initstruktur(self)                     <------ hier wird der Dummy aufgerufen 
       ::erzeugeStruktur(self)              <------ hier wird der Dummy aufgerufen 
RETURN self
********************************************************************************
********************************************************************************
********************************************************************************
CLASS filiale FROM datenbank, _filiale
      EXPORTED:
      VAR cBlzNr,;
          cPlzNr

      METHOD initvaria
      METHOD BriefkopfAbsender
      METHOD sucheEigeneFiliale
ENDCLASS
********************************************************************************
METHOD filiale:initvaria()
       ::cDbank  := ::cIdSatzText := "Filialen"                                 // Name der DB und der Indexdatei und der Beschreibung in der IDS des Feldes
       ::cPfad   := "..\datenbanken\parameter\"                                 // Verzeichnis der DB und des Index
       ::nIdSatz := 2
       ::cBlzNr  := Space(8)                                                    // für Eingabefelder,...
       ::cPlzNr  := Space(10)                                                   // für Eingabefelder, damit keine IDplz dort steht
RETURN self

********************************************************************************
********************************************************************************
CLASS _filiale
      EXPORTED:

      METHOD initstruktur
      METHOD erzeugestruktur
ENDCLASS
********************************************************************************
METHOD _filiale:initstruktur(objekt)
// ACHTUNG immer auf Datum achten
// IndexArray {TAG,Schlüssel,Hinweistext,lUnique,Indexumschaltung im Browse, IndexAktiv}
       objekt:aIndex := {;
                         {"ID" ,"Str(id,8,0)","ID"         ,.F.,""   ,.F.},;
                         {"BEZ","Upper(bez)" ,"Bezeichnung",.F.,"bez",.T.};
                        }
       objekt:cDbStrukturDatum := "20091018"
       objekt:cIndexKeyDatum   := "20080208"
RETURN self
********************************************************************************
METHOD _filiale:erzeugestruktur(objekt)
//!!!ACHTUNG, die Felder auch als MemVar eintragen in der Klasse, oder dem Objekt
// DbStruktur {Feldname,Feldart,Breite,Nachkomma,,Browse-Überschrift,Browserfeld,Picture,TOOLTIP,Erklärung}
       objekt:aStruktur := {}
       ::StrukturArray1(objekt)
       AAdd(objekt:aStrukturErweitert,{"BANK"      ,"C",40,0,"","Bank:"          ,"n",""                        ,"TOOLTIP"   ,""})
       AAdd(objekt:aStrukturErweitert,{"BEZ"       ,"C",40,0,"","Firma"          ,"n","@K !"+Repl("X",39)       ,"Bezeichnung",""})
       AAdd(objekt:aStrukturErweitert,{"BLZ"       ,"C", 8,0,"","BLZ"            ,"n","99999999"                ,"TOOLTIP",""})
       AAdd(objekt:aStrukturErweitert,{"EMAIL"     ,"C",40,0,"","Mailadresse"    ,"n",""                        ,"Mailadresse",""})
       AAdd(objekt:aStrukturErweitert,{"FUSSZEILE1","C",80,0,"","Fusszeile1"     ,"n",""                        ,"1.Fusszeile",""})
       AAdd(objekt:aStrukturErweitert,{"FUSSZEILE2","C",80,0,"","Fusszeile2"     ,"n",""                        ,"2.Fusszeile",""})
       AAdd(objekt:aStrukturErweitert,{"GF"        ,"C",30,0,"","Geschäftsführer","n",""                        ,"TOOLTIP"   ,""})
       AAdd(objekt:aStrukturErweitert,{"IMHAUS"    ,"L", 1,0,"","im Haus"        ,"n",""                        ,"Wenn es die eigene und keine Fremdfiliale ist",""})
       AAdd(objekt:aStrukturErweitert,{"KUERZEL"   ,"C", 6,0,"","Kürzel"         ,"n","!!!!!!"                  ,"Kurzbezeichnung für interne Abwicklungen"     ,""})
       AAdd(objekt:aStrukturErweitert,{"KTONR"     ,"N",12,0,"","Kontonummer"    ,"n","@K 9999 9999 99"         ,"TOOLTIP",""})
       AAdd(objekt:aStrukturErweitert,{"ORT"       ,"C",25,0,"",""               ,"n","@K !"+Repl("X",24)       ,"TOOLTIP",""})
       AAdd(objekt:aStrukturErweitert,{"PLZ"       ,"N", 5,0,"","Plz"            ,"n","99999"                   ,"TOOLTIP",""})
       AAdd(objekt:aStrukturErweitert,{"SLOGAN"    ,"C",50,0,"","Slogan"         ,"n","@K !"+Repl("X",49)       ,"einen evtl. Slogan der Firma eingeben",""})
       AAdd(objekt:aStrukturErweitert,{"SMTP"      ,"C",50,0,"","SMTP-Server"    ,"n",""                        ,"TOOLTIP",""})
       AAdd(objekt:aStrukturErweitert,{"SMTPPW"    ,"C",50,0,"","SMTP-Passwort"  ,"n",""                        ,"TOOLTIP",""})
       AAdd(objekt:aStrukturErweitert,{"STEUERNR"  ,"C",12,0,"","Steuernummer"   ,"n","@K 9999/9999/9999/"      ,"TOOLTIP",""})
       AAdd(objekt:aStrukturErweitert,{"STRASSE"   ,"C",40,0,"","Strasse"        ,"n","@K !"+Repl("X",39)       ,"TOOLTIP",""})
       AAdd(objekt:aStrukturErweitert,{"TELEFON"   ,"C",21,0,"","Telefon"        ,"n","@K (99999) 99 99 99 99 9","TOOLTIP",""})
       AAdd(objekt:aStrukturErweitert,{"TELEFAX"   ,"C",21,0,"","Telefax"        ,"n","@K (99999) 99 99 99 99 9","TOOLTIP",""})
       AAdd(objekt:aStrukturErweitert,{"USERNAME"  ,"C",20,0,"","SMTP-Username"  ,"n",""                        ,"TOOLTIP",""})
       AAdd(objekt:aStrukturErweitert,{"USTID"     ,"C",12,0,"","Ust.-ID."       ,"n",""                        ,"TOOLTIP",""})
       AAdd(objekt:aStrukturErweitert,{"WEBSEITE"  ,"C",30,0,"","Webadresse"     ,"n","@K http://www."          ,"TOOLTIP",""})
       AAdd(objekt:aStrukturErweitert,{"ZUSATZ1"   ,"C",40,0,"","Zusatz1"        ,"n",""                        ,"zusätzliche Firmenbezeichnung",""})
       AAdd(objekt:aStrukturErweitert,{"ZUSATZ2"   ,"C",40,0,"","Zusatz2"        ,"n",""                        ,"zusätzliche Firmenbezeichnung",""})
       ::StrukturArray2(objekt)
       ::Strukturerweitert2Struktur(objekt)
RETURN self


Ich habe das jetzt etwas eingekürzt.

Re: Methoden überladen

Verfasst: Do, 10. Jun 2010 16:26
von Markus Walter
Hi,

es wäre hilfreich zu wissen WO genau jetzt das Problem liegt...

Re: Methoden überladen

Verfasst: Do, 10. Jun 2010 17:17
von Manfred
Auch Hi,

habe ich doch oben mit Pfeilen gemarkert. Die erste Methode wird über die Instanz aufgerufen und klappt und die beiden anderen, werden aus der Superklasse (Dummy) aufgerufen und nicht aus der Instanz genommen. Also da klappt die Überladung nicht.

Re: Methoden überladen

Verfasst: Mo, 14. Jun 2010 11:08
von Markus Walter
Nochmal hi,

das ist ja toll mit den Pfeilen, aber mir fehlt immer noch das Bilden der Instanzen...

Ich vermute, dass es daran liegt, dass die methoden in beiden Superklassen vorkommen. Da gewinnt links vor rechts oder umgekehrt...

Re: Methoden überladen

Verfasst: Mo, 14. Jun 2010 11:56
von Manfred
Ach so,

ganz einfach. Beim Bilden der Instanzen wird die Methode Init() aus der Superklasse aufgerufen. Dort werden dann die weiteren Methoden abgearbeitet. Die 1. wird im Objekt ausgeführt und die 2. und 3. in der Superklasse (Dummies) mehr nicht.

Was heißt in beiden Superklassen? Es gibt nur eine. Die andere, in der die "richtigen" Methoden stehen erbt nur von der Superklasse. Wie gesagt, die 1.Methode wird in der Instanz ausgeführt, die beiden weiteren aber nicht. Das ist es was mich so nachdenklich macht.

Re: Methoden überladen

Verfasst: Mo, 14. Jun 2010 13:48
von Markus Walter

Code: Alles auswählen

CLASS filiale FROM datenbank, _filiale
Deine Klasse filiale erbt von 2 Klassen: datenbank, _filiale

Zeig doch (endlich :wink: ) einfach mal, welche Klasse Du instanzierst und was Du erwartest. So wie ich Deine Instanzierung vermute, scheint mir klar zu sein, dass die methode initstruktur aus filiale nicht gerufen wird. Aber das ist alles Vermutung, weil ich nicht sehe, was Du wirklich machst...

Ich vermute, dass Du erwartest, dass die methode init() aus der Klasse datenbank, die methode initstruktur aus _filiale aufruft?! Vermute ich da richtig?

Re: Methoden überladen

Verfasst: Mo, 14. Jun 2010 14:36
von Manfred
Hi Markus,

das ist alles.

Code: Alles auswählen

ofiliale := filiale():new()

Re: Methoden überladen

Verfasst: Mo, 14. Jun 2010 15:06
von Markus Walter
Hi,

ich hatte das "erwartest" doch extra fett gedruckt...

Ich vermute immer noch (du willst es mir ja scheinbar nicht schreiben... :wink: ), dass die Methode initstruktur aus der Klasse _filiale gerufen wird. Richtig?

Das würde ich in Deinem Fall nicht erwarten.

Du erzeugst eine Instanz:
ofiliale := filiale():new()

dadurch werden die init()-Methoden der Superklassen gerufen. datenbank:init() ruft datenbank:initstruktur. Aber die Klasse _filiale ist eine gleichberechtigte Klasse zu datenbank. Gerade beim Erben von mehreren Superklassen muss man da genau aufpassen (auch bei gleichnamigen iVars).

Anders wäre es wohl, wenn Du folgendes Konstrukt hättest:

Code: Alles auswählen

Class Datenbank
...
Endclass

Class _filiale from Datenbank
...
Endclass

Class filiale from _filiale
...
Endclass
Ich habe das alles nicht ausprobiert, würde es aber vermuten.

Mach doch mal einen einfachen Test: Baue Dir doch die Methoden einfach mit einer "?"-Ausgabe in ein Crt-Fenster und dann siehst Du in welcher Konstellation was gerufen wird. Also ungefähr so:

Code: Alles auswählen

METHOD datenbank:initstruktur()
? "Datenbank:initstruktur"
RETURN self

METHOD _filiale:initstruktur()
? "_filiale:initstruktur"
RETURN self

Re: Methoden überladen

Verfasst: Mo, 14. Jun 2010 15:26
von Manfred
Hi Markus,

jetzt verstehe ich was Du meinst.

Brrr, hat etwas länger gedauert. Initvaria() ist in class filiale und die anderen sind in _filiale, was aber erst hinter datenbank steht, in der Reihenfolge. Ja, das könnte es sein. Verflixt, also nix mit mal eben überladen. Augen auf.

Die Frage ist jetzt nur kann man das einfach von der Reihenfolge her vertauschen, ohne andere Seiteneffekte zu bekommen? Hm, mal nachdenken und ausprobieren. Wenn nicht, dann lasse ich es so, wie es die ganze Zeit war.

Re: Methoden überladen

Verfasst: Mo, 14. Jun 2010 15:34
von Markus Walter
Hi Manfred,

besser spät als nie... :wink:

Das Vertauschen der Reihenfolge wird meines Erachtens nichts bringen, ich glaube nicht, dass eine Methode einer parallelen Klasse aufgerufen wird...

Re: Methoden überladen [ERLEDIGT]

Verfasst: Mo, 14. Jun 2010 16:10
von brandelh
Hi,

wenn eine Klasse von 2 Basisklassen erbt, dann wird eine Methode die in beiden Basisklassen enthalten ist, kann
die Methode der ersten Basisklasse wie üblich oder mit :Klassenname: (also Super) aufgerufen werden.
Die gleiche Methode der weiteren Basisklassen wir nur aufgerufen, wenn man den Klassennamen nutz !

Beispiel: XbpCombobox() -> und dortige Hilfe !!!

:getData() haben alle Xbase-Parts. Die Combobox erbt von XbpListbox und XbpSLE,
wobei XbpListbox() in der Vererbungshirarchie vorher kommt, daher kann man den XbpListBox() Wert direkt abfragen:

Code: Alles auswählen

aItems := oCombobox:getData()             // Werte in der Listbox 
Will man es genauer ausdrücken, oder braucht man den XbpSLE() Wert, muss man so schreiben ("Cast")

Code: Alles auswählen

aItems := oCombobox:XbpListBox:getData()  // Werte in der Listbox 
cBuffer:= oCombobox:XbpSLE:getData()      // Wert im Eingabefeld 
wenn ich in einer eigenen Klasse von zwei Basisklassen erbe, würde ich vermuten, dass die
zuerst genannte Basisklasse auch die ist, die in der Vererbungshirarchie oben steht.
Somit kommt es schon darauf an in welcher Reihenfolge man bei CLASS ... FROM ... etwas schreibt.

Ob dies damit gemeint war, weiß ich aber nicht, ich habe den Thread ehrlich gesagt nicht ganz durchgelesen ;-)

Re: Methoden überladen [ERLEDIGT]

Verfasst: Mo, 14. Jun 2010 16:15
von Manfred
Hi Hubert,

ich würde sagen, Du hast es richtig verstanden.

Ich denke mal, ich begrabe die Idee, weil ich doch mein Glück kenne. Irgendwas anderes klappt dann später nicht nicht und dass wird dann übel enden.