Autor Beitrag
cbs
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207
Erhaltene Danke: 1



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 116

Suse 9.1 WinXP
D6 Pers
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 116

Suse 9.1 WinXP
D6 Pers
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
type
  TTest = class(TObject)
  private
    { Private declarations }
  public
    { Public declarations }
  end;


type
  TTest2 = class(Unit1.TTest)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

_________________
...und da wurde mir klar, dass eine Toolbar keine Kneipe für Heimwerker ist.
cbs Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: 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:

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: 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.