Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Verschachtelte Datenklassen readonly (https://www.delphipraxis.net/215495-verschachtelte-datenklassen-readonly.html)

freimatz 15. Jul 2024 13:09

Verschachtelte Datenklassen readonly
 
Hallo zusammen,
ich habe ein Design-Problem. Extrem vereinfachtes Beispiel:
Ich habe eine Datenklasse, die hat, weils so schön ist, auch ein interface:
Delphi-Quellcode:
 
  ICoreData = interface
    function GetA(): Integer;
    function GetB(): Double;
    procedure SetA(const p_Value: Integer);
    procedure SetB(const p_Value: Double);
    property A: Integer read GetA write SetA;
    property B: Double read GetB write SetB;
  end;

  TCoreData = class(TInterfacedObject, ICoreData)
  strict private
    FA: Integer;
    FB: Double;
    function GetA(): Integer;
    function GetB(): Double;
    procedure SetA(const p_Value: Integer);
    procedure SetB(const p_Value: Double);

  public
    property A: Integer read GetA write SetA;
    property B: Double read GetB write SetB;
  end;
Nun möchte ich die Daten weitergeben, der Empfänger soll da nichts ändern können. Ich mache daher ein Read-Only-Interface.
Delphi-Quellcode:
  ICoreDataReadOnly = interface
    function GetA(): Integer;
    function GetB(): Double;
    property A: Integer read GetA;
    property B: Double read GetB;
  end;

  TCoreData = class(TInterfacedObject, ICoreData, ICoreDataReadOnly)
Soweit so gut.
Nun aber sollen die Daten mit anderen zusammen gepackt werden. Also:
Delphi-Quellcode:
  IKomplexData = interface
    function GetC(): ICoreData;
    function GetD(): string ;
    procedure SetC(const p_Value: ICoreData);
    procedure SetD(const p_Value: string );
    property C: ICoreData read GetC write SetC;
    property D: string read GetD write SetD;
  end;
Das geht auch noch, aber beim Read-Only stehe ich an. Ich hätte das gerne so:
Delphi-Quellcode:
 
  IKomplexDataReadOnly = interface
    ['{059FFBF5-789F-4DFB-9B3C-3F549B4BB0A9}']
    function GetC(): ICoreDataReadOnly;
    function GetD(): string ;
    property C: ICoreDataReadOnly read GetC;
    property D: string read GetD;
  end;
Dann hat das property C zwei verschiedene Typen: einmal ICoreData und einmal ICoreDataReadOnly. Man kann doch aber nur eine implementieren. Ein overload z.B. gibts bei properties ja nicht.
Irgendwelche Ideen?

Uwe Raabe 15. Jul 2024 13:28

AW: Verschachtelte Datenklassen readonly
 
Für sowas gibt es die Method Resolution Clause. Damit kann man die implementierende Methode anders nennen als in dem Interface.
Delphi-Quellcode:
type
  TKomplexData = class(TInterfacedObject, IKomplexDataReadOnly, IKomplexData)
    function IKomplexDataReadOnly.GetC = GetCReadOnly;
  private
    function GetCReadOnly: ICoreDataReadOnly;
    function GetC: ICoreData;
    function GetD: string;
    procedure SetC(const p_Value: ICoreData);
    procedure SetD(const p_Value: string );
  end;

freimatz 15. Jul 2024 13:36

AW: Verschachtelte Datenklassen readonly
 
Ah, ich erinnere mich vage. Das stand doch auch schon in einem Buch ("COM/DCOM mit Delphi"?). Hatte ich vergessen.
Danke.

DeddyH 15. Jul 2024 13:49

AW: Verschachtelte Datenklassen readonly
 
https://docwiki.embarcadero.com/RADS...implementieren
Da steht es auch (ohne Buch) :-)

freimatz 16. Jul 2024 13:59

AW: Verschachtelte Datenklassen readonly
 
Habe es ausprobiert. Funktioniert (nach der Beseitigung etlicher Bretter vor meinem Kopf :-D)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 Uhr.

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