| Autor |
Beitrag |
cbs
      
Beiträge: 207
Erhaltene Danke: 1
|
Verfasst: Mi 31.12.03 16:02
moin leuts
ich hab ein problem mit der vererbung
ich habe mir eine klasse geschrieben (TParser) die methoden enthält um eine webseite zu parsen
jetzt möchte ich neue klassen erstellen die von TParser abgeleitet sind und verschiedene Daten aus der Seite rauslesen mit hilfe der methoden von TParser
deklariert habe ich das folgendermaßen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| TParser = class(TObject) private FPage: string; public function LoadPage(URL: string): Boolean; end;
TDataList = class(TParser) private FList: TList; public constructor Create; destructor Destroy; override; end; |
das problem ist das die methoden von TParser nicht mehr in TDataList auftauchen. ich habe schon probiert die methoden als protected oder public zu deklarieren. aber die methoden sind nicht mehr in TDataList bekannt abwohl TDataList ja eindeutig von TParser abgeleitet ist.
die beiden klassen liegen in unterschiedlichen units. die unit von TParser ist aber in der unit von TDataList mit eingebunden. daran sollte es eigenltich nicht liegen
wo liegt da das problem?
danke schonmal!
Zuletzt bearbeitet von cbs am Fr 02.01.04 17:26, insgesamt 1-mal bearbeitet
|
|
TomT
      
Beiträge: 116
Suse 9.1 WinXP
D6 Pers
|
Verfasst: Fr 02.01.04 15:56
Es könnte sich um einen Konflikt handeln, da es in Delphi schon eine Klasse TParser gibt.
MFG TomT
_________________ ...und da wurde mir klar, dass eine Toolbar keine Kneipe für Heimwerker ist.
|
|
UC-Chewie
      
Beiträge: 531
WinXP
D5 Ent
|
Verfasst: Fr 02.01.04 16:19
Wenn es mehrere Klassen mit gleichem Namen gibt, wird die genommen, die in der gleichen Unit liegt. Gibt es da keine, wird die aus der Unit genommen, die zuerst in der uses-Klausel auftaucht.
Setz also die Unit, in der du TParser deklariert hast, als erstes in die uses-Klausel, und das Problem müsste gelöst sein.
_________________ Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: Fr 02.01.04 16:22
Nein, es wird immer die Klasse genommen, die der Compiler als letzes findet.
Daher muss die Unit möglichst hinter "Classes" stehen.
|
|
cbs 
      
Beiträge: 207
Erhaltene Danke: 1
|
Verfasst: Fr 02.01.04 17:24
jo DANKE!
wenn ich die unit als letztes in die uses einfüge funktionierts.
ich hatte in der OH nach TParser gesucht und keinen eintrag dazu gefunden. deshalb habe ich dummerweise angenommen das es die klasse noch nicht gibt
aber ich werd meine vorsichtshalber umbennen. thx nochmal!
mfg cbs
|
|
UC-Chewie
      
Beiträge: 531
WinXP
D5 Ent
|
Verfasst: Fr 02.01.04 23:32
| obbschtkuche hat folgendes geschrieben: | | Nein, es wird immer die Klasse genommen, die der Compiler als letzes findet. |
Echt? Hmm, dann verstehe ich aber nicht ganz, warum bei DLLs mit Strings die Unit ShareMem als erstes in dies Liste muss 
_________________ Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
|
|
TomT
      
Beiträge: 116
Suse 9.1 WinXP
D6 Pers
|
Verfasst: Sa 03.01.04 06:54
Um sicher zu gehen, dass die Klasse aus der gewünschten Unit verwendet wird kann man auch die Unit mit angeben, also:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| type TTest = class(TObject) private public end;
type TTest2 = class(Unit1.TTest) private public end; |
_________________ ...und da wurde mir klar, dass eine Toolbar keine Kneipe für Heimwerker ist.
|
|
cbs 
      
Beiträge: 207
Erhaltene Danke: 1
|
Verfasst: Sa 03.01.04 13:05
| TomT hat folgendes geschrieben: | | Um sicher zu gehen, dass die Klasse aus der gewünschten Unit verwendet wird kann man auch die Unit mit angeben |
axo.. gut zu wissen. hab meine klasse einfach in THtmlParser umbennant. passt auch besser
thx nochmal!
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Sa 03.01.04 19:20
| UC-Chewie hat folgendes geschrieben: | | obbschtkuche hat folgendes geschrieben: | | Nein, es wird immer die Klasse genommen, die der Compiler als letzes findet. |
Echt? Hmm, dann verstehe ich aber nicht ganz, warum bei DLLs mit Strings die Unit ShareMem als erstes in dies Liste muss  |
Weil die Unit ShareMem den Standard-Memory-Manager ersetzt...
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
UC-Chewie
      
Beiträge: 531
WinXP
D5 Ent
|
Verfasst: So 04.01.04 14:28
| Motzi hat folgendes geschrieben: | | Weil die Unit ShareMem den Standard-Memory-Manager ersetzt... |
Ja, aber wenn doch Funktionen aus einer hinteren Unit zuerst ausgeführt werden ??
_________________ Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: So 04.01.04 17:16
Ich vermute, damit Befehle in "initialization"-Bereichen der Units auch mit dem richtigen Memorymanager ausgeführt werden. Ist aber wie gesagt nur eine Vermutung.
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: So 04.01.04 17:50
Weil die Units in der Reihenfolge initialisiert werden wie sie in der uses-Liste stehen. Und die Unit-ShareMem muss schließlich den Memory-Manager entsprechend initialisieren, _bevor_ eine andere Unit initialisiert wird und dabei auf den "falschen" Memory-Manager zurückgreift...
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
UC-Chewie
      
Beiträge: 531
WinXP
D5 Ent
|
Verfasst: So 04.01.04 19:38
Ja, aber:
| obbschtkuche hat folgendes geschrieben: | Nein, es wird immer die Klasse genommen, die der Compiler als letzes findet.
Daher muss die Unit möglichst hinter "Classes" stehen. |
Das heißt, bei Klassen die letzte Unit, bei Funktionen die erste 
_________________ Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: So 04.01.04 19:44
Die initialization-Teile der Units werden in der Reihenfolge abgearbeitet, wie sie hinter uses stehen. Da der MemoryManager bei initialization aktiviert wird, muss er direkt als erstes stehen, damit bei der i. der anderen Units der richtige Manager verwendet wird.
|
|