Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Klassen-Typ als Parameter? (https://www.delphipraxis.net/193836-klassen-typ-als-parameter.html)

Jasocul 14. Sep 2017 07:43

Klassen-Typ als Parameter?
 
Hallo,
ich "bastel" gerade an einer Vorbereitung zu einem neuen Projekt und habe dabei folgende Konstruktion:
Delphi-Quellcode:
  tBase = class(TObject)
  private
  end;

  tBaseDesc1 = class(tBase)
  private
  public
    constructor Create(aXMLNode : IXMLNode); virtual;
    destructor Destroy; override;
  end;

  tBaseDesc2 = class(tBase)
  private
  public
    constructor Create(aXMLNode : IXMLNode); virtual;
    destructor Destroy; override;
  end;
// u.s.w. (ca. 80 Ableitungen von tBase)
In einigen Konstruktoren muss ich Objekte erzeugen, wobei der Source für einige Teile nahezu identisch ist. Da ich es hasse, immer fast gleichen Source zu schreiben, möchte ich da optimieren. Das Problem ist dabei, dass ich in diesen kurzen Blocken auch unterschiedliche Klassen verwende:
Delphi-Quellcode:
// vNL : IXMLNodeList;
   if Assigned(vNL.FindNode('MyNodeName')) then
   begin
     fBaseDescX := tBaseDescX.Create(vNL.FindNode('MyNodeName'));
   end
   else
   begin
     fBaseDescX := nil;
   end;
Mein Ziel ist es, dafür eine Methode zu haben, die mir fBaseDescX liefert. Dabei müsste ich als Parameter folgendes übergeben:
- MyNodeName
- vNL
- tBaseDescX

Die ersten Beiden sind ja kein Problem, aber bei dem Klassen-Typ fällt mir nichts brauchbares ein.

Habt Ihr Anregungen oder Lösungen dafür?

Uwe Raabe 14. Sep 2017 07:56

AW: Klassen-Typ als Parameter?
 
Ungefähr so:
Delphi-Quellcode:
  TBaseClass = class of tBase;

  TBase = class(TObject)
  private
  public
    constructor Create(aXMLNode : IXMLNode); virtual; abstract; // abstract kann entfallen, wenn hier schon gemeinsamer Code hin kann
  end;

  TBaseDesc1 = class(TBase)
  private
  public
    constructor Create(aXMLNode : IXMLNode); override;
    destructor Destroy; override;
  end;

  TBaseDesc2 = class(TBase)
  private
  public
    constructor Create(aXMLNode : IXMLNode); override;
    destructor Destroy; override;
  end;

function MakeInstance(vNL : IXMLNodeList; const MyNodeName: string, MyClass: TBaseClass): TBase;
var
  node: IXMLNode;
begin
   node := vNL.FindNode(MyNodeName);
   if Assigned(node) then
   begin
     fBaseDescX := MyClass.Create(node);
   end
   else
   begin
     fBaseDescX := nil;
   end;
end;

Jasocul 14. Sep 2017 08:03

AW: Klassen-Typ als Parameter?
 
Danke für den Ansatz, Uwe.
Ich werde mal damit experimentieren. Ergebnisse, bzw. Fragen werde ich dann hier eintragen.

[EDIT]
Mit der richtigen Zuweisung des Result und anschließendem TypeCast funktioniert es jetzt wie gewünscht.

Aviator 14. Sep 2017 09:04

AW: Klassen-Typ als Parameter?
 
Eventuell wären Interfaces und/oder Generics in diesem Zusammenhang noch interessant da du schreibst, dass Codeteile nahezu identisch sind.

Jasocul 14. Sep 2017 09:11

AW: Klassen-Typ als Parameter?
 
Generics setze ich dort zum Teil auch schon ein. Ich habe hier nur einen kleinen Ausschnitt dargestellt, um es nicht zu unübersichtlich zu machen. :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz