Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Eigene Klasse von TObjectDictonary (https://www.delphipraxis.net/199047-eigene-klasse-von-tobjectdictonary.html)

psycodad 20. Dez 2018 16:23

Eigene Klasse von TObjectDictonary
 
Guten Abend allerseits,

Ich probiere mir eine eigene Klasse von TObjectDictionary zu basteln. Das geht ja alles gut unds kompiliert auch. Wenn ich allerdings dann ein Objekt von der Klasse erzeugen möchte, ist beim "Inherited Create( s,0)" im Constructor Schluss mit Lustig. Ich krieg immer ne Fehlermeldung:

Erste Gelegenheit für Exception bei $77401812. Exception-Klasse EInvalidCast mit Meldung 'Ungültige Typumwandlung'. Prozess MyProg.exe (6512)


Code:
type
  TReportCache = class( TObjectDictionary<String,TfrxReport> )
  private
  public
    function GetReportObject( const aReportName: string): TfrxReport;
    procedure DelReportObject( const aReportName: string);
    Constructor Create;
  end;

implementation

{ TReportCache }

constructor TReportCache.Create;
var
  s: TDictionaryOwnerShips;
begin
  s := [doOwnsKeys, doOwnsValues];
  inherited Create( s, 0);
end;
Wenn ich "inherited Create" im Constructor ohne Parameter aufrufe funktionierts, allerdings krieg ich dann üble Speicherlecks weil die Objekte so in der Liste natürlich nicht abgeräumt werden.

Hat mir jemand einen Tipp was ich falsch mache?

Neutral General 20. Dez 2018 16:27

AW: Eigene Klasse von TObjectDictonary
 
Kannst du mal Code zeigen wie du das Objekt erstellst/benutzt?

freimatz 20. Dez 2018 16:29

AW: Eigene Klasse von TObjectDictonary
 
Hm, meine Vermutung ist das doOwnsKeys. Key ist bei Dir ein String. Das ist kein Objekt, welches das Dictionary freigeben darf.
Sonst wäre es ja schon noch interssant wo denn die Schutzverletzung kommt. Doch wohl nicht in dem Code den du hier zeigst.

psycodad 20. Dez 2018 16:29

AW: Eigene Klasse von TObjectDictonary
 
Code:
var
  ReportCache: TReportCache;
begin
 ReportCache := TReportCache.Create();
end;

psycodad 20. Dez 2018 16:32

AW: Eigene Klasse von TObjectDictonary
 
Mann mann mann, jepp, das war's. Das ich da nicht selber drauf gekommen bin.

VIELEN DANK.

Der schöne Günther 20. Dez 2018 16:48

AW: Eigene Klasse von TObjectDictonary
 
Tipp: Soweit du keinen wirklich guten Grund hast tust dir keinen Gefallen mit der Vererbung. Nimm stattdessen ein TObjectDictionary<String,TfrxReport> und benutze es.

https://de.wikipedia.org/wiki/Kompos..._von_Vererbung

Delphi-Quellcode:
TReportCache = class
   private var
      dictionary: TObjectDictionary<String, TFrxReport>;
   public
      function GetReportObject( const aReportName: string): TfrxReport;
      procedure DelReportObject( const aReportName: string);
      Constructor Create();
end;

psycodad 31. Jan 2019 13:18

AW: Eigene Klasse von TObjectDictonary
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1421448)
Tipp: Soweit du keinen wirklich guten Grund hast tust dir keinen Gefallen mit der Vererbung. Nimm stattdessen ein TObjectDictionary<String,TfrxReport> und benutze es.

https://de.wikipedia.org/wiki/Kompos..._von_Vererbung

Delphi-Quellcode:
TReportCache = class
   private var
      dictionary: TObjectDictionary<String, TFrxReport>;
   public
      function GetReportObject( const aReportName: string): TfrxReport;
      procedure DelReportObject( const aReportName: string);
      Constructor Create();
end;

Danke für den Tipp. Werde es in Zukunft mit Kompositon machen, sehr einleuchtend. Eine kleine Frage noch zu deinem Beispiel: Wieso machst du ein private var? Würde nicht ein private alleine reichen?

Der schöne Günther 31. Jan 2019 19:24

AW: Eigene Klasse von TObjectDictonary
 
Ja, es würde reichen. Ich habe mir einfach angewöhnt in Klassendefinitionen die Variablen von den Methoden zu trennen:

Delphi-Quellcode:
TReportCache = class
    private var
        someVariable: Integer;
        someOtherVariable: Integer;
    private
        procedure doStuff();
end;

MyRealName 1. Feb 2019 00:08

AW: Eigene Klasse von TObjectDictonary
 
Man braucht doch die Klasse drumherum garnicht, einfach

Code:
ReportCache := TDictionary<String,TFrxReport>.Create;
und dann statt dem

Code:
function GetReportObject( const aReportName: string): TfrxReport;
einfach

Code:
ReportCache.TrygetValue(aReportName, aObj);
aufrufen.

freimatz 1. Feb 2019 07:29

AW: Eigene Klasse von TObjectDictonary
 
Weil:
Zitat:

Zitat von Der schöne Günther (Beitrag 1421448)
Tipp: Soweit du keinen wirklich guten Grund hast tust dir keinen Gefallen mit der Vererbung. Nimm stattdessen ein TObjectDictionary<String,TfrxReport> und benutze es.

https://de.wikipedia.org/wiki/Kompos..._von_Vererbung

Oder auch Favour_Composition_over_Inheritance_FCoI

psycodad 1. Feb 2019 07:43

AW: Eigene Klasse von TObjectDictonary
 
Naja, Wenn ich aber noch nicht genau weiss was da alles noch reinkommen könnte (Ev. Zugriffsverwaltung etc..) macht es durchaus Sinn, das in eine Klasse zu verpacken. Das Ganze läuft als Singleton. Das Objekt wir beim Start des Programms erzeugt und beim Beenden desselben verworfen. Wenn man dann eine Klasse daraus macht dann ist es eben aus den oben genannten Gründen besser diese nicht direkt von TObjectDictionary abzuleiten.

Oder liege ich da komplett falsch?

psycodad 1. Feb 2019 07:49

AW: Eigene Klasse von TObjectDictonary
 
Zitat:

Zitat von freimatz (Beitrag 1424533)
Weil:
Zitat:

Zitat von Der schöne Günther (Beitrag 1421448)
Tipp: Soweit du keinen wirklich guten Grund hast tust dir keinen Gefallen mit der Vererbung. Nimm stattdessen ein TObjectDictionary<String,TfrxReport> und benutze es.

https://de.wikipedia.org/wiki/Kompos..._von_Vererbung

Oder auch Favour_Composition_over_Inheritance_FCoI

Tolle Website. Ich lerne gerade ne Menge...

Der schöne Günther 1. Feb 2019 08:37

AW: Eigene Klasse von TObjectDictonary
 
Zitat:

Zitat von psycodad (Beitrag 1424534)
Naja, Wenn ich aber noch nicht genau weiss was da alles noch reinkommen könnte (Ev. Zugriffsverwaltung etc..) macht es durchaus Sinn, das in eine Klasse zu verpacken. (…) Oder liege ich da komplett falsch?

Nö, ich sehe das genau gleich, aber das hatten wir ja schon 😉

Wir sparen ja auch nichts (außer vlt. einmal 10 Zeilen) dadurch dass wir nicht direkt von TDictionary<> ableiten...


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:00 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