gpt4 book ai didi

delphi - Delphi 基本接口(interface)不能以多态方式工作

转载 作者:行者123 更新时间:2023-12-03 15:45:33 35 4
gpt4 key购买 nike

我创建了几个接口(interface)来描述集合及其项目:IetCollection 和 IetCollectionItem。当然,我有两个类实现这两个接口(interface):TetCollection 和 TetCollectionItem(都继承自 TInterfacedObject。)

然后我有一系列接口(interface),其中顶级接口(interface)继承自 IetCollectionItem,其余接口(interface)继承自 IetCollectionItem(让我们称它们为 ISomeBasicType、ISomeSpecificType1 和 ISomeSpecificType2。)

TSomeBasicType 类继承自 TetCollectionItem 类,并且还实现了 ISomeBasicType。层次结构中的其他类继承自 TSomeBasicType 并实现各自的接口(interface)(即 ISomeSpecificType1 和 ISomeSpecificType2。)

当我填充集合时,我使用工厂方法来获取对 ISomeBasicType 的引用。到目前为止,一切都运行良好。

但是当我尝试遍历集合并询问集合项是否支持 ISomeSpecificType1 或 ISomeSpecificType2 时,我得到的答案是否定的。

我一直在尝试解决这个问题,但一无所获,因此我们将不胜感激。

这是一些代码:

// This is the basic type
IetCollectionItem = interface
end;

// Implementation of the basic type
TetCollectionItem = class(TInterfacedObject, IetCollectionItem)
end;

ISomeBasicType = interface(IetCollectionItem)
end;

ISomeSpecificType1 = interface(ISomeBasicType)
end;

// Implements ISomeBasicType, should inherit implementation of IetCollectionItem
// from TetCollectionItem
TSomeBasicType = class(TetCollectionItem, ISomeBasicType)
end;

// Implements ISomeSpecificType1, should inherit implementation of ISomeBasicType
// from TSomeBasicType and implementation of IetCollectionItem from
// TetCollectionItem
TSomeSpecificType1 = class(TSomeBasicType, ISomeSpecificType1)
end;

这是我用来填充集合的代码:

var
aBaseType: ISomeBasicType;
aSpecificType: ISomeSpecificType1;
begin
aBaseType:= TheFactory(anID, aType); // Returns a reference to ISomeBasicType

if Supports(aBaseType, ISomeSpecificType1, aSpecificType) then
begin
// Do something to the specific type
aTypeCollection.Add(aSpecificType);
end
else
aTypeCollection.Add(aBaseType);

这是失败的代码:我循环遍历集合并检查其中的任何项目是否支持其中一个子接口(interface)。

var
iCount: Integer;
aBaseType: ISomeBasicType;
aSpecificType: ISomeSpecificType1;
begin
for iCount:= 0 to Pred(aTypeCollection.Count) do
begin
aBaseType:= aTypeCollection[iCount];

// This is where Supports fails
if Supports(aBaseType, ISomeSpecificType1, aSpecificType) then
begin
end;
end;
end;

这是 TheFactory 的代码:

function TheFactory(const anID: Integer; const aType: TetTypes): ISomeBasicType;
begin
Result:= nil;

case aType of
ptType1 : Result:= TSomeSpecificType1.Create(anID, aType);
ptType2 : Result:= TSomeSpecificType2.Create(anID, aType);
end;

Assert(Assigned(Result), rcUnknonwPhenomenonType);
end; {TheFactory}

最佳答案

虽然你的代码让我很头晕,但仅从你的问题标题我就有一种感觉,我知道你的问题出在哪里。不幸的是,Delphi 的接口(interface)多态性的行为与 Delphi 的类多态性不同(我在某处读到这与某些 COM 接口(interface)兼容性有关)。关键是,如果您正在查询特定接口(interface)的类实例,Delphi 只会找到直接在类声明中列出的那些接口(interface),尽管类声明中的另一个接口(interface)可能是从您正在查询的接口(interface)继承的。请看这个简单的例子来理解我的意思。抱歉,如果我的回答完全错过了您的问题。

type
TForm61 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

IBase = interface
['{AE81FB3C-9159-45B0-A863-70FD1365C113}']
end;

IChild = interface(IBase)
['{515771E7-44F6-4819-9B3A-F2A2AFF74543}']
end;

TBase = class(TInterfacedObject, IBase)

end;

TChild = class(TInterfacedObject, IChild)

end;

TChildThatSupportsIbase = class(TChild, IBase)

end;

var
Form61: TForm61;

implementation

{$R *.dfm}

procedure TForm61.Button1Click(Sender: TObject);
var
Child: IChild;
ChildThatSupportsIbase: IChild;
begin
Child := TChild.Create;
ChildThatSupportsIbase:= TChildThatSupportsIbase.Create;
if Supports(Child, IBase) then
ShowMessage('TChild supports IBase')
else
ShowMessage('TChild doesn''t supports IBase');
if Supports(ChildThatSupportsIbase, IBase) then
ShowMessage('TChildThatSupportsIbase supports IBase')
else
ShowMessage('TChildThatSupportsIbase doesn''t supports IBase');
end;

关于delphi - Delphi 基本接口(interface)不能以多态方式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6521587/

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