我有两个接口,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
,因此SomeInterface
与Result
兼容。那意味着你可以写Result := SomeInterface;
但是,我会在具有该值的
TSomeClass
上放置一个构造函数,以便您可以直接编写:Result := TSomeClass.Create(10);