gpt4 book ai didi

delphi - 将对象转换为没有 TInterfacedObject 作为基类的接口(interface)类型

转载 作者:行者123 更新时间:2023-12-03 14:43:09 24 4
gpt4 key购买 nike

我需要一个类实现没有引用计数的接口(interface)。我做了以下事情:

  IMyInterface = interface(IInterface)
['{B84904DF-9E8A-46E0-98E4-498BF03C2819}']
procedure InterfaceMethod;
end;

TMyClass = class(TObject, IMyInterface)
protected
function _AddRef: Integer;stdcall;
function _Release: Integer;stdcall;
function QueryInterface(const IID: TGUID; out Obj): HResult;stdcall;
public
procedure InterfaceMethod;
end;

procedure TMyClass.InterfaceMethod;
begin
ShowMessage('The Method');
end;

function TMyClass.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;

function TMyClass._AddRef: Integer;
begin
Result := -1;
end;

function TMyClass._Release: Integer;
begin
Result := -1;
end;

缺乏引用计数效果很好。但我担心的是,我无法使用 as 运算符将 TMyClass 转换为 IMyInterface:

var
MyI: IMyInterface;
begin
MyI := TMyClass.Create as IMyInterface;

我被给予了

[DCC Error] E2015 Operator not applicable to this operand type

TMyClass 派生自 TInterfacedObject 时,问题就消失了 - 即我可以在没有编译器错误的情况下进行此类转换。显然我不想使用 TInterfacedObject 作为基类,因为它会使我的类引用计数。为什么不允许这样的转换以及如何解决它?

最佳答案

您无法在代码中使用 as 的原因是您的类未在其支持的接口(interface)列表中显式列出 IInterface。即使您的接口(interface)派生自 IInterface,除非您实际列出该接口(interface),否则您的类不支持它。

因此,最简单的解决方法是像这样声明您的类:

TMyClass = class(TObject, IInterface, IMyInterface)

您的类需要实现 IInterface 的原因是编译器依赖它来实现 as 强制转换。

我想指出的另一点是,一般来说,您应该避免使用接口(interface)继承。总的来说,它没什么用处。使用接口(interface)的好处之一是您可以摆脱实现继承带来的单一继承约束。

但无论如何,所有Delphi接口(interface)automatically inherit from IInterface所以在你的情况下没有必要指定这一点。我会这样声明你的界面:

IMyInterface = interface
['{B84904DF-9E8A-46E0-98E4-498BF03C2819}']
procedure InterfaceMethod;
end;

更广泛地说,您应该尽量不要在接口(interface)中使用继承。通过采用这种方法,您将减少耦合,从而带来更大的灵 active 。

关于delphi - 将对象转换为没有 TInterfacedObject 作为基类的接口(interface)类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14931940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com