Einzelnen Beitrag anzeigen

xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#4

Re: IInterface und TInterfaced Object richtig nutzen

  Alt 22. Aug 2006, 11:48
Hallo,
Zitat von Thorus:
Wieso kann ich nicht "const e: IElem" statt "const e: IInterface" machen? Spielt das eine Rolle bei dem folgendem Problem?
Das spielt keine Rolle, aber IInterface ist allgemeiner.
Zitat von Thorus:
Ich hatte etwas vergessen, nämlich, im Interface IElem soll es die Funktion "Str" nicht geben, aber bei der Implementation von TElemStr schon.
Ist doch kein Problem.
Zitat von Thorus:
Jetzt bleibt das Problem, wie ich in der Funktion equals (1. Nachricht) casten kann. Und dann auf die Funktion Str zugreifen kann.
Soll das heißen, Du willst über das Interface auf das Objekt zugreifen? Dann kannst Du sowas machen:
Delphi-Quellcode:
type
  IElem = interface(IInterface)
  ['{8D4708F4-026A-4CE6-B8EB-5CC20D1FF32A}'] // <- Beispiel-GUID
    function Equals(const e: IInterface): Boolean; // <- Interfaces *IMMER* als const übergeben, spart Referenzzählung
    function GetSelf: TObject; // <- Gibt das eigentliche Objekt zurück
  end;

  TElemStr = class(TInterfacedObject, IElem)
  private
    Content: string;
  public
    function Equals(const e: IInterface): Boolean;
    function GetSelf: TObject;
  end;

implementation

uses
  SysUtils;

const
  // Für Vergleich deklarieren
  IID_ELEM: TGUID = '{8D4708F4-026A-4CE6-B8EB-5CC20D1FF32A}';

function TElemStr.Equals(const e: IInterface): Boolean;
begin
  Result := Supports(e, IID_ELEM); // implementiert "e" ein IElem?

  // Aufruf der Objektfunktion:
  if Result then
    TElemStr(e as IElem).GetSelf).Str := 'xyz';
end;

function TElemStr.GetSelf: TObject;
begin
  Result := Self;
end;
Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat