![]() |
Readonly interface erzeugen (MMX?)
Hallo,
ich habe hier ein interface für eine Datenklasse. Nun hätte ich gere ein weiteres interface das gleich ist, nur dass es keine Setter gibt. Es soll sicherstellen, dass man die Daten nur liest aber nicht (leichfertig) ändert. (Abgesehen von Referenzen auf weitere Objekte.) Das Erzeugen ist z.B. mit MMX ja leidlich einfach zu machen. Wenn man während der Entwicklung immer wieder das Ausgangsinterface anpasst, ist das etwas mühsam. Gibt es da eine einfache Möglichkeit die ich übersehen habe? |
AW: Readonly interface erzeugen (MMX?)
Kannst du mal den aktuellen und gewünschten Vorgang in einem Beispiel beschreiben?
|
AW: Readonly interface erzeugen (MMX?)
Genau falsch rum. (Vererbung: Dinge hinzufügen, aber nicht entfernen)
Das Readonly bauen, dann davon ableiten und das Schreiben hinzufügen. Bei IInterfaces ist es aber kein Problem, dort zwei Interfaces zu bauen, die nicht voneinander abgeleitet sind. (aber auch da ist es möglich) Allerdings, wenn das RW-Interface öffentlich bekannt ist (über GetInterface/GetInterfaceEntry/GetInterfaceTable abrufbar), dann ließe sich das Interface auch abfragen/tauschen. |
AW: Readonly interface erzeugen (MMX?)
@Uwe: So ähnlich wie bei Spring die IList und IReadOnlyList.
Delphi-Quellcode:
Nur als Beispiel. Was ich konkret jetzt habe ich ist eine Hierarchie mit 17 interfaces und 57 Properties. (Ergebnis des Versuches ein Berg von technischen Schulden zu erklimmen :-))
type
IData = interface ['{E9154DD9-A28E-4703-9DD8-5181A27869E2}'] function GetActualValue(const p_Component: Byte): double; function GetCurrentActual(): IActualValue; function GetDefaultBehaviourMode(): String; procedure SetActualValue( const p_Component: Byte; const p_Value : double); procedure SetCurrentActual(const p_Value: IActualValue); procedure SetDefaultBehaviourMode(const p_Value: String); property DefaultBehaviourMode: String read GetDefaultBehaviourMode write SetDefaultBehaviourMode; property CurrentActual: IActualValue read GetCurrentActual write SetCurrentActual; property ActualValue[const p_Component: Byte]: double read GetActualValue write SetActualValue; end; IReadOnlyData = interface ['{7F08C18E-0E6A-40F1-9DD9-AFDDA473FB8B}'] function GetActualValue(const p_Component: Byte): double; function GetCurrentActual(): IActualValue; function GetDefaultBehaviourMode(): String; property DefaultBehaviourMode: String read GetDefaultBehaviourMode; property CurrentActual: IActualValue read GetCurrentActual; property ActualValue[const p_Component: Byte]: double read GetActualValue; end; @himitsu: sehe jetzt nicht wie es damit weniger mühsam wird. |
AW: Readonly interface erzeugen (MMX?)
Was genau ist jetzt die Schwierigkeit mit der Erstellung dieser beiden Interfaces? (Mir ist einfach noch nicht klar, was genau dein Problem ist.)
|
AW: Readonly interface erzeugen (MMX?)
Delphi-Quellcode:
In diesem Fall kann man durch Vererbung nur die Declaration der Getter sparen.
type
IReadOnlyData = interface ['{7F08C18E-0E6A-40F1-9DD9-AFDDA473FB8B}'] function GetActualValue(const p_Component: Byte): double; property ActualValue[const p_Component: Byte]: double read GetActualValue; end; IData = interface(IReadOnlyData) ['{E9154DD9-A28E-4703-9DD8-5181A27869E2}'] procedure SetActualValue(const p_Component: Byte; const p_Value : double); property ActualValue[const p_Component: Byte]: double read GetActualValue write SetActualValue; end; Wenn ein Object IData unterstützt, sollte auch immer IReadOnlyData mit angegeben werden. Sonst wird IReadOnlyData bei der direkten Abfrage nicht gefunden. |
AW: Readonly interface erzeugen (MMX?)
Ich würde das viel einfacher machen:
Delphi-Quellcode:
Wer sich zum Schreiben extra das entsprechende Interface holen kann, kann auch einfach die Setter verwenden. Dann sieht man auch direkt, dass da geschrieben wird. Dann gibt es auch keine doppelten Deklarationen der Properties usw. und da die Properties in Interfaces auch nur syntaktischer Zucker sind, muss man die noch nicht einmal in der implementierenden Klasse deklarieren.
type
IData = interface ['{E9154DD9-A28E-4703-9DD8-5181A27869E2}'] procedure SetActualValue(const p_Component: Byte; const p_Value : double); procedure SetCurrentActual(const p_Value: IActualValue); procedure SetDefaultBehaviourMode(const p_Value: String); end; IReadOnlyData = interface ['{7F08C18E-0E6A-40F1-9DD9-AFDDA473FB8B}'] function GetActualValue(const p_Component: Byte): double; function GetCurrentActual(): IActualValue; function GetDefaultBehaviourMode(): String; property DefaultBehaviourMode: String read GetDefaultBehaviourMode; property CurrentActual: IActualValue read GetCurrentActual; property ActualValue[const p_Component: Byte]: double read GetActualValue; end; Dadurch ist der Anpassungsaufwand relativ niedrig. |
AW: Readonly interface erzeugen (MMX?)
Delphi-Quellcode:
Wäre das noch eine Alternative, mit Ableitung der Interfaces ?
type
IReadOnlyData = interface ['{7F08C18E-0E6A-40F1-9DD9-AFDDA473FB8B}'] function GetActualValue(const p_Component: Byte): double; function GetCurrentActual(): IActualValue; function GetDefaultBehaviourMode(): String; property DefaultBehaviourMode: String read GetDefaultBehaviourMode; property CurrentActual: IActualValue read GetCurrentActual; property ActualValue[const p_Component: Byte]: double read GetActualValue; IData = interface( IReadOnlyData ) ['{E9154DD9-A28E-4703-9DD8-5181A27869E2}'] procedure SetActualValue(const p_Component: Byte; const p_Value : double); procedure SetCurrentActual(const p_Value: IActualValue); procedure SetDefaultBehaviourMode(const p_Value: String); property DefaultBehaviourMode: String read GetDefaultBehaviourMode write SetDefaultBehaviourMode; property CurrentActual: IActualValue read GetCurrentActual write SetCurrentActual; property ActualValue[const p_Component: Byte]: double read GetActualValue write SetActualValue; end; Sonst ist das IData nur um Schreiben, das wäre nicht so ideal, allerdings sind abgeleitete interfaces auch nicht so toll. |
AW: Readonly interface erzeugen (MMX?)
Zitat:
|
AW: Readonly interface erzeugen (MMX?)
Zitat:
Hatte gedacht vielleicht gibt es da etwas schon. Scheint wohl nicht so zu sein. Als Wunsch für MMX ist wohl auch zu aufwendig. Danke für alle Rückmeldungen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 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