Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.177 Beiträge
 
Delphi 12 Athens
 
#4

AW: Gleiche Interface-Referenzen?

  Alt 6. Mär 2015, 07:59
Mist, dann werde ich wohl doch eine Typ-Prüfmethode Vorsoglich-Umwandlungsmethode (Supports) einbauen müssen.

Eine Tyüprüfung ala IS (if not (Value is IFoo) then Value := Value as IFoo; ) geht ja nicht.
Bei Objekten zeigen unterschiedlich gecastete "Typen" ja immer auf die selbe Adresse und für Objekte kenn ich nichts, um den Interface-Typ hinter einem Interface festzustellen, sowas wie if Value.Type = IFoo .

Dachte ich kann mir die zusäztlichen Operationen sparen, welche ja wild mit der Referenzzählung und zusätzlichen Variablen rumfuchteln.



Also hier nutzen die schon nicht mehr den selben Slot,
außer man deklariert TFooBar so class(TFoo, IBar, IFoo, IBlubb) .

Da die Klasse nur intern ist, kann ich erzwingen, daß es genau so definiert wäre, aber ob der Code dann sicher wäre.
Delphi-Quellcode:
type
  IFoo = interface
    ['{05C90FF9-4788-49FB-9C60-CA901F8BBEBA}']
    procedure Foo;
  end;
  IBar = interface(IFoo)
    ['{01B62A8B-40E4-417C-AC63-F787C26DA89F}']
    procedure Bar;
  end;
  IBlubb = interface
    ['{A35EE740-965E-4F97-9AC2-A99F165B0322}']
    procedure Foo;
  end;
  TFoo = class(TInterfacedObject, IFoo)
    procedure Foo;
  end;
  TFooBar = class(TFoo, IBar, IBlubb)
    procedure Bar;
  end;

procedure TForm3.FormCreate(Sender: TObject);
var
  F: IFoo;
  B: IBar;
  X: IBlubb;
begin
  B := TFooBar.Create as IBar;
  F := B;
  Memo1.Lines.Add(Format('$%p $%p', [Pointer(B), Pointer(F)]));
  F := B as IFoo;
  Memo1.Lines.Add(Format('$%p $%p', [Pointer(B), Pointer(F)]));

  F := TFooBar.Create as IFoo;
  B := F as IBar;
  Memo1.Lines.Add(Format('$%p $%p', [Pointer(F), Pointer(B)]));

  X := B as IBlubb;
  Memo1.Lines.Add(Format('$%p $%p', [Pointer(F), Pointer(X)]));
end;

procedure TFooBar.Bar;
begin
end;

procedure TFoo.Foo;
begin
end;

Aber vielleicht lass' ich es erstmal so und bau mir eine Methode, welche am Anfang die InterfaceTable ausslist und prüft.
Müsste ja jedes Interface, was von außerhalb meiner Klasse kommt immer schön prüfen und umwandeln, bevor es in den Listen landet und/oder verglichen wird.

Statt einem
Zitat:
if Value as TFoo = Self then
wollte ich schon ein if Value.IsSelf(Self) then einbauen, aber in mobilen macht das keinen Unterschied, da es in beiden Varianten zusätzliche Variablen mit zusätzlichen Referenzen gibt (intern ja das Self).



Ach ... ich denk nochmal 'nen Tag und dann am Abend gucken, was ich (erstmal) mach.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 6. Mär 2015 um 08:06 Uhr)
  Mit Zitat antworten Zitat