Einzelnen Beitrag anzeigen

hschmid67

Registriert seit: 2. Jul 2012
Ort: Weilheim i. Obb.
71 Beiträge
 
Delphi 12 Athens
 
#3

AW: Vererbung und generische Listen

  Alt 6. Nov 2017, 09:12
Hmm, ja, das mit dem Klassendesign ist so wohl nicht verständlich (und vielleicht auch diskussionswürdig).

Also noch ein wenig mehr Erklärung:

Ich möchte mit TMS Aurelius meine DB-Tabellen zugreifbar machen (über REST, aber das spielt beim eigentlichen Problem wohl keine Rolle). Dazu gibt es eine Basisklasse, die die Grundfunktionen zur Verfügung stellt, also vor allem eine Funktion, um die Ergebnisse von Suchen in verschiedenen Formen auszugeben (z.B. als json, als Objekt, als Liste...).

Nun gibt es FObject in der Basisklasse, was sowohl ein direktes Objekt beinhalten kann, als auch ein Array, bzw. eine Objektliste, je nach dem, ob es nur einen Treffer in der DB bei der Suche gibt, oder eben mehrere. Aurelius liefert hier zweierlei als Ergebniss:

Fobject -> TeinTabellenObjekt

oder

Fobject -> TObjectList<TeinTabellenObject>

Nun möchte ich in meiner Basisclasse gerne zwei Funktionen einbauen, die das Fobject entwerder als Object oder als ObjectList ausgibt:

Delphi-Quellcode:
TBaseClass = class
  Fobject: Tobject;
  function AsObject: TeinTabellenObjekt
  function AsList: TObjectList<TeinTabellenObjekt>;
end;

TSpecialClass<T: class> = class(TBaseClass)
  procedure SucheIrgendwas;
end;

procedure TSpecialClass<T>.SucheIrgendwas;
begin
  Fobject := Manager.Find<T>(123); // Ergebnis ist vom Typ T
oder
  Fobject := Manager.Find<T>.Add(Linq['lastname'] = 'xyz').List; // Ergebnis ist vom Typ TObjectList<T>
end;
Dazu müsste ich in AsObject, wenn Fobject eine Liste ist, das erste Element der Liste ausgeben. Nun ist die Basisklasse aber noch nicht generisch und die Funktion soll ja für alle Objekte funktionieren.

Also in etwa so:

Delphi-Quellcode:
function TBaseClass.AsObject: TeinTabellenObjekt;
begin
  Result := Fobject;
  if IsObjectList(Fobject) then
    Result := TObjectList(Fobject)[0];
end;
So hatte ich es mir vorgestellt. Funktioniert aber leider nicht...

Am liebsten hätte ich in AsObject ja noch den Typ mit dabei, aber es würde mir schon reichen, wenn ich ein Tobject aus der Liste bekäme.

Viele Grüße
Harald
Harald Schmid
  Mit Zitat antworten Zitat