Einzelnen Beitrag anzeigen

WiPhi

Registriert seit: 19. Feb 2015
90 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: IInvokable nachträglich einem Interface hinzufügen

  Alt 6. Sep 2018, 11:28
Nein, so sollst du das machen
Delphi-Quellcode:
procedure Test( );
var
  mock: TMock<IMirrorFoo>;
  mirror: IMirrorFoo;
  org: IFoo;
begin
  // .....
  mirror := mock;
  org := IFoo( mirror ); // <-- WiPhi: darauf bin ich nicht gekommen, ehrlich gesagt wundert es mich das der Compiler das zulässt
  org.Foo();
Das sieht sehr gut aus! Vielen Dank.

Leider zieht das Problem weitere Kreise. Ich habe ein Interface (in dem Package) gefunden, welches als Rückgabewert einer Funktion ein Interface liefert, welches auch keine RTTI Informationen enthält. Sobald er im Test darauf zugreifen möchte, schmiert er mit einer Zugriffsverletzung ab.

Delphi-Quellcode:
IBar = interface
  procedure KannNichts;
end;

IFoo = interface
  function DoBar: IBar;
end;

{$M+}
IMirrorFoo = interface
  function DoBar: IBar;
end;
{$M-}

// ........

procedure TestKlasse.TesteFoo;
var
  mock: TMock<IMirrorFoo>;
  mirror: IMirrorFoo;
  foo: IFoo;
  bar: IBar;
begin
  // ... Code wie bisher ...
  bar := org.DoBar; // <-- Da kommt nichts mehr sinnvolles, Zugriffsverletztung
end;
Dieses IBar Interface auch nch irgendwie da rein zu mogeln kommt mir fast einer Schande gleich, dennoch die Frage ob es möglich ist.

Aber!
Wahrscheinlich wäre es sinnvoller die betreffenden Interfaces zu wrappen und nur noch über diese Wrapper Interfaces zu arbeiten. Dann müsste ich zwar ziemlich viel doppelt schreiben (Wrapper und Package Interfaces), aber ich könnte das Package evtl. jederzeit ersetzen und wesentlich komfortabler testen.

Wie würdet ihr damit verfahren? (Ein Glück hier gibt's so viele Profis )
Wer sucht, der findet. Wer länger sucht, findet mehr.
  Mit Zitat antworten Zitat