Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Property in Interface?? (https://www.delphipraxis.net/65692-property-interface.html)

winx 20. Mär 2006 09:11


Property in Interface??
 
Hallo,

wie kann ich mir in einem Interface eine Property erstellen???

Delphi-Quellcode:
 IPDFImporter = interface(IInterface)
    //property File:TStringList read write; ???
    procedure convert();
  end;
Danke,
winx

jbg 20. Mär 2006 09:13

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;

sakura 20. Mär 2006 09:15

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:
  IContentLanguages0400 = interface(IDispatch)
    function Get_Status: EContentLanguageStatus; safecall;
    procedure Set_Status(Value: EContentLanguageStatus); safecall;

    property Status: EContentLanguageStatus read Get_Status write Set_Status;
  end;
...:cat:...

winx 20. Mär 2006 09:18

Re: Property in Interface??
 
Danke :-)

Elvis 20. Mär 2006 09:50

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:
TSample = class
private
  fValue : Integer;
  procedure setValue(value : Integer);
public
  property Value : Integer read fValue write setValue;
end;
Jetzt noch folgendes Interface

Delphi-Quellcode:
ISample = interface
  function getValue : Integer;
  procedure setValue(value : Integer);
  property Value : Integer read getValue write setValue;
end;
Da man properties nicht abstrakt deklarieren kann, muss ich ja hier explizit eine Getter und Setter methode definieren.

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:
TAggregatedSample = class(TInterfacedObject, ISample)
private
  fSample : TSample;
protected
  property Sample : TSample read fSample implements ISample;
end;
Und das hier ist irgendwie ziemlich unschön:
Delphi-Quellcode:
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;
Also ist es möglich eine Methode zu deklarieren, die die gleiche Signatur wie "read fValue" hat?
Ich hoffe mit den Beispielen war klar, was ich meinte... :gruebel:

shmia 20. Mär 2006 10:22

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;

Elvis 20. Mär 2006 10:31

Re: Property in Interface??
 
Zitat:

Zitat von shmia
Das geht mit einer Methodenzuordnungsklausel

Erstmal thx für die Antwort. :)
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.

jbg 20. Mär 2006 10:41

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.

Elvis 20. Mär 2006 10:46

Re: Property in Interface??
 
Dachte ich mir schon, aber als "unrealistischer Träumer"™ wollte ich mir erst ein explizites "Nö" abholen. ;)

sakura 20. Mär 2006 10:57

Re: Property in Interface??
 
Zitat:

Zitat von Elvis
Dachte ich mir schon, aber als "unrealistischer Träumer"™ wollte ich mir erst ein explizites "Nö" abholen. ;)

Gerne doch: :mrgreen: Mich hat es auch schon des öfteren geärgert :(

...:cat:...


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