![]() |
Property in Interface??
Hallo,
wie kann ich mir in einem Interface eine Property erstellen???
Delphi-Quellcode:
Danke,
IPDFImporter = interface(IInterface)
//property File:TStringList read write; ??? procedure convert(); end; winx |
Re: Property in Interface??
Du brauchst dazu eine setter bzw. getter Methode im Interface:
Delphi-Quellcode:
type
ITest = interface function GetMyProp: Integer; procedure SetMyProp(Value: Integer); property MyProp: Integer read GetProp write SetProp; end; |
Re: Property in Interface??
So wie Du es auch von Klassen kennst, allerdings musst Du immer Methoden nutzen, da Interfaces keine eigenen Felder haben ;)
Delphi-Quellcode:
...:cat:...
IContentLanguages0400 = interface(IDispatch)
function Get_Status: EContentLanguageStatus; safecall; procedure Set_Status(Value: EContentLanguageStatus); safecall; property Status: EContentLanguageStatus read Get_Status write Set_Status; end; |
Re: Property in Interface??
Danke :-)
|
Re: Property in Interface??
Moin Mieze, moin Andreas :hi:
Da ihr zwei euch doch etwas mehr mit Delphis internals auskennt... Gibt es hier einen Trick um einen Getter/Setter zu deklarieren, der die gleiche Signatur wie die direkte Verwendung eines Feldes in der read/write Clause hat? Nehmen wir folgende Klasse:
Delphi-Quellcode:
Jetzt noch folgendes Interface
TSample = class
private fValue : Integer; procedure setValue(value : Integer); public property Value : Integer read fValue write setValue; end;
Delphi-Quellcode:
Da man properties nicht abstrakt deklarieren kann, muss ich ja hier explizit eine Getter und Setter methode definieren.
ISample = interface
function getValue : Integer; procedure setValue(value : Integer); property Value : Integer read getValue write setValue; end; Wenn ich jetzt ISample an eine Property vom Type TSample delegieren will, habe ich das Propblem, dass der Getter nicht die richtige Signatur hat. Hier fehlt ihm der Getter:
Delphi-Quellcode:
Und das hier ist irgendwie ziemlich unschön:
TAggregatedSample = class(TInterfacedObject, ISample)
private fSample : TSample; protected property Sample : TSample read fSample implements ISample; end;
Delphi-Quellcode:
Also ist es möglich eine Methode zu deklarieren, die die gleiche Signatur wie "read fValue" hat?
TAggregatedSample = class(TInterfacedObject, ISample)
private fSample : TSample; protected function getValue : Integer; property Sample : TSample read fSample implements ISample; end; ... function TAggregatedSample.getValue : Integer; begin result := fSample.Value; end; Ich hoffe mit den Beispielen war klar, was ich meinte... :gruebel: |
Re: Property in Interface??
Das geht mit einer Methodenzuordnungsklausel:
Delphi-Quellcode:
ISample = interface
function getValue : Integer; procedure setValue(value : Integer); property Value : Integer read getValue write setValue; end; TIrgendwas = class(TInterfacedObject, ISample) function InternGetValue: Integer; procedure InternSetValue(value:Integer); function ISample.getValue=InternGetValue; // Methodenzuordnungsklausel procedure ISample.setValue=InternSetValue; // dito end; |
Re: Property in Interface??
Zitat:
Resolution clauses sind mir bekannt, aber da bin ich wieder dabei eine Wrapper funktion zu schreiben. Ich hatte auf einen Weg gehofft wie ich ein Interface direkt an ein Aggregat delegieren kann, OHNE zusätzlichen Code zu schreiben. ;) Vllt sollte ich mir mal die Exports einen Packages anschauen. Vllt gibt es eine bestimmte Namensconvention für diese direkten Feld -Getter/-Setter. |
Re: Property in Interface??
Das geht nicht, weil der Compiler für "read fValue" keine getter Methode generiert, sondern beim Lesezugriff darauf, direkt auf das private-Feld fValue zugreift. In den RTTI wird das Feld TPropInfo.GetProc auf $FFxxxxxx gesetzt, wobei xxxxxx der Offset zu Self ist. Also auch von dort keine Change.
|
Re: Property in Interface??
Dachte ich mir schon, aber als "unrealistischer Träumer"™ wollte ich mir erst ein explizites "Nö" abholen. ;)
|
Re: Property in Interface??
Zitat:
...:cat:... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 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 by Thomas Breitkreuz