我有两个接口,ISomeInterfaceRO(只读)和ISomeInterface。

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;


然后,当我将TSomeClass实例创建为ISomeInterface并填充它时,我将使用只读接口(一个地方除外)。例:

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


我的问题是:“结果:= SomeInterface作为ISomeInterfaceRO;”是安全且推荐的结构?还是另一种方式做到这一点?
我调试了该代码,当我使用“ as”时,编译器适当地减少了对ISomeInterface的引用计数,并增加了对ISomeInterfaceRO的引用计数。

最佳答案

Result := SomeInterface as ISomeInterfaceRO;


是安全的,但不是必需的,因为ISomeInterface继承自ISomeInterfaceRO,因此SomeInterfaceResult兼容。那意味着你可以写

Result := SomeInterface;


但是,我会在具有该值的TSomeClass上放置一个构造函数,以便您可以直接编写:

Result := TSomeClass.Create(10);

09-20 23:39