2016-06-03 3 views
1

Ich habe zwei Schnittstellen, ISomeInterfaceRO (nur lesen) und ISomeInterface.Delphi - Schnittstelle als eine andere Schnittstelle

ISomeInterfaceRO = interface(IInterface) ['{B28A9FB0-841F-423D-89AF-E092FE04433F}'] 
function GetTest: Integer; 
    property Test : integer read GetTest; 
end; 

ISomeInterface = interface(ISomeInterfaceRO) ['{C7148E40-568B-4496-B923-89BB891A7310}'] 
    procedure SetTest(const aValue: Integer); 
    property Test : integer read GetTest write SetTest; 
end; 

TSomeClass = class(TInterfacedObject, ISomeInterfaceRO, ISomeInterface) 
private 
    fTest: integer; 
protected 
    function GetTest: integer; 
    procedure SetTest(const aValue: integer); 
public 
    property Test: integer read GetTest write SetTest; 
end; 

function TSomeClass.GetTest: integer; 
begin 
    Result := fTest; 
end; 

procedure TSomeClass.SetTest(const aValue: integer); 
begin 
    fTest := aValue; 
end; 

Dann benutze ich nur mit einer Ausnahme Ort-Schnittstelle gelesen, wenn ich TSomeClass Instanz als ISomeInterface erstellen und füllen. Beispiel:

Function GetSome: ISomeInterfaceRO; 
var 
    SomeInterface: ISomeInterface; 
begin 
    SomeInterface := TSomeClass.Create; 
    SomeInterface.Test := 10; 
    result := SomeInterface as ISomeInterfaceRO; 
end; 

Meine Frage ist: das "Ergebnis: = SomeInterface als ISomeInterfaceRO;" ist eine sichere und empfohlene Konstruktion? Oder ist das ein anderer Weg? Ich debuggte diesen Code, und der Compiler reduzierte die Referenzanzahl korrekt auf ISomeInterface und erhöhte auf ISomeInterfaceRO, wenn ich "as" verwendete.

+2

Es ist nicht richtig, die Frage zu ändern, nachdem der Anruf beantwortet wurde. Sie sollten Ihre Medizin nehmen und den Fehler erkennen. Immerhin habe ich Sie rechtzeitig vor den Problemen von G + gewarnt. Jetzt müssen Sie eine neue Frage stellen. –

+1

Ok, das werde ich mir für die Zukunft merken – Stregor

Antwort

4
Result := SomeInterface as ISomeInterfaceRO; 

ist sicher, aber nicht notwendig, überhaupt, weil ISomeInterface erbt von ISomeInterfaceRO und damit SomeInterface ist Zuordnung kompatibel zu Result. Das heißt, Sie nur

schreiben
Result := SomeInterface; 

Ich würde jedoch einen Konstruktor auf TSomeClass setzen, die den Wert annimmt, so dass Sie auch direkt schreiben können:

Result := TSomeClass.Create(10); 
+0

Hallo Stefan! Vielen Dank für Ihren Kommentar. Ich weiß, dass mein vorheriger Beispielcode nicht auf meine ECHTE Frage fokussiert ist :) Also, ich werde es bearbeiten und erben entfernen. – Stregor