Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - methoden sind nach vererbung nicht mehr bekannt [gelöst]
cbs - Mi 31.12.03 16:02
Titel: methoden sind nach vererbung nicht mehr bekannt [gelöst]
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!
TomT - 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
UC-Chewie - 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.
Anonymous - 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 - 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! :D
mfg cbs
UC-Chewie - 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 :?
TomT - 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; |
cbs - 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 :wink:
thx nochmal!
Motzi - 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...
UC-Chewie - 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 ??
Anonymous - 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 - 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...
UC-Chewie - 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 :shock:
Anonymous - 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!