Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Vererbung bei Listenobjekten
VizeTE - Sa 20.03.04 01:08
Titel: Vererbung bei Listenobjekten
Heyho.
Ich habe das folgendes Problem...
Ich habe 4 Objekte, 2 Listenobjekte und 2 "normale" Objekte. Zunächst habe ich eine
BasisListe und ein Basisobjekt. Ziel ist es dann von diesen Klassen weitere
Listen bzw. Objekte abzuleiten.
Nun hätte ich gern in der BasisListe eine Routine die diese mit Objekten füllt. So
kann ich später diese Routine in der abgeleiteten Liste aufrufen um diese, wer
hätte das gedacht, mit Objekten zu füllen.
Nun weiß ich allerdings zur Entwurfszeit der BasisListe noch nicht welche Art von
Objekten (abgeleitet vom BasisObjekt) später in der Liste hinzugefügt werden sollen.
Diese Information benötige ich jedoch um die Objekte zu erzeugen. Also müsste ich
in der BasisListe irgendwie die Zielklasse bekannt machen?!
Ich hoffe das war jetzt nicht allzu verwirrend.
Hat irgendwer eine Idee, ist das überhaupt möglich, kann man die Klasse vielleicht irgendwie
übergeben?
Vielen Dank
VizeTE
smiegel - Sa 20.03.04 09:01
Hallo,
folgend ein Ausschnit aus der Delphi-Hilfe:
OH hat folgendes geschrieben: |
Eine abstrakte Methode ist eine virtuelle oder dynamische Methode, die nicht in der Klasse implementiert wird, in der sie deklariert ist. Die Implementierung wird erst später in einer abgeleiteten Klasse durchgeführt. Bei der Deklaration abstrakter Methoden muß wie im folgenden Beispiel die Anweisung abstract nach virtual oder dynamic angegeben werden:
procedure DoSomething; virtual; abstract;
Eine abstrakte Methode kann nur in einer Klasse (bzw. Instanz einer Klasse) aufgerufen werden, in der sie überschrieben wurde.
|
Christian S. - Sa 20.03.04 12:41
Hallo!
Sehr gut erklärt ist das auch in Luckie's Tutorial zu dem Kram, auf
http://www.luckie-online.de
MfG
Peter
VizeTE - Di 23.03.04 22:30
Moin, moin.
Das ist leider noch nicht ganz das was ich möchte (glaube ich). Ich versuche
das einfach mal an einem Beispiel näher zu erläutern...(unter Einbezug der oben
genannten Ansätze mit "abstract")
Also zunächst die 2 BasisObjecte:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| TBasisObject = class(TObject) protected ReadFromDB(ADataSet: TDataSet); virtual; abstract end;
TBasisList = class(TObjectList) protected ReadFromDB(ADataSet: TDataSet); virtual; end;
implementation
procedure TBasisList.ReadFromDB(ADataSet: TDataSet); virtual; var ABasisObject: TBasisObject; begin ADataSet.First; while not ADataSet.Eof do begin ABasisObject := TBasisObject.Create; ABasisObject.ReadFromDB(ADataSet); Add(ABasisObject); ADataSet.Next; end; end; |
und dann die 2 Arbeitsobjecte
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| TMyObject = class(TBasisObject) protected ReadFromDB(ADataSet: TDataSet); override; end;
TMyList = class(TBasisList) end; |
So und dann der Aufruf...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure Run; var AList : TMyList; begin AList := TMyList.Create; AList.ReadFromDB(MyDataSet);
AList.Clear; AList.Free; end; |
Ich suche nun nach einer Möglichkeit, dass ich nicht jedes mal "ReadFromDB" für TMyList
deklarieren muss, aus diesen Grund hätt' ich das gern in der BasisListe. Nun weiß ich
aber nicht so recht wie ich in der Methode "Run" "AList" klar machen soll welche
Objekte ich die Liste sollen, sprich wie ich ihm klar mach das "ReadFromDB" von TMyList
verwendet werden soll.
Das oben genannte Forum habe ich mir noch nicht angeschaut da ich befürchte, dass
"abstract" mich nicht weiter bringen wird aber ich werde das auf jeden Fall noch
nachholen :wink:
Vielen Dank schon mal im Vorraus.
maximus - Mi 24.03.04 11:41
VizeTE hat folgendes geschrieben: |
...
Ich suche nun nach einer Möglichkeit, dass ich nicht jedes mal "ReadFromDB" für TMyList
deklarieren muss, aus diesen Grund hätt' ich das gern in der BasisListe. Nun weiß ich
aber nicht so recht wie ich in der Methode "Run" "AList" klar machen soll welche
Objekte ich die Liste sollen, sprich wie ich ihm klar mach das "ReadFromDB" von TMyList
verwendet werden soll.
... |
Um das zu erreichen kann man klassen registrieren ->
RegisterClass (unRegisterClass!!) und mit
findClass kannst du dann einen klassennamen in eine klassen-variable auflösen, die du dann für die instanzierung benutzt. Dh. aber du brauchst vor der instanzierung den namen der klasse aus deine DB.
Aber sollte ja kein problem sein...wenn die genaue anwendung unklar ist, sag bescheid :wink:
Udontknow - Mi 24.03.04 18:22
Zitat: |
sprich wie ich ihm klar mach das "ReadFromDB" von TMyList
verwendet werden soll.
|
Nun, ich würde TBasisList von TBasisObjekt ableiten. Dann musst du zwar selber ein bisschen Handarbeit machen, indem du die Funktionen von TObjectList nachbildest, aber das ist ja nicht so viel.
Edit: Hmmm, deine Schilderung ist ein wenig schwammig... Du weisst, das du das Verhalten von als "virtual" gekennzeichneten Methoden in einem Nachfahr per "override" verändern kannst?
Cu,
Udontknow
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!