Autor Beitrag
VizeTE
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Sa 20.03.04 01:08 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: 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.

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 20.03.04 12:41 
Hallo!

Sehr gut erklärt ist das auch in Luckie's Tutorial zu dem Kram, auf www.luckie-online.de

MfG
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
VizeTE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



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

ausblenden 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); virtualabstract
  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

ausblenden 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...

ausblenden 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);

    //do anything

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

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: 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:

_________________
mfg.
mâximôv
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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