gpt4 book ai didi

delphi - Spring4D中如何使用多接口(interface)类

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

我刚刚学习 Spring4D,我有一个问题。如果类只实现一个接口(interface),那就很清楚了:

    IWeapon = interface
['{E679EDA6-5D43-44AD-8F96-3B5BD43A147B}']
procedure Attack;
end;

TSword = class(TInterfacedObject, IWeapon)
public
procedure Attack;
end;

GlobalContainer.RegisterType<TSword>.Implements<IWeapon>('sword');
sword := ServiceLocator.GetService<IWeapon>('sword');

我现在真的很开心,我有剑而且我不需要释放它。

但是如果类实现了两个或多个接口(interface):

    IWeapon = interface
['{E679EDA6-5D43-44AD-8F96-3B5BD43A147B}']
procedure Attack;
end;

IShield = interface
['{B2B2F443-85FE-489C-BAF4-538BB5B377B3}']
function Block: Integer;
end;

TSpikedShield = class(TInterfacedObject, IWeapon, IShield)
public
function Block: Integer;
procedure Attack;
end;

GlobalContainer.RegisterType<TSpikedShield>.Implements<IWeapon>.Implements<IShield>;

我可以向 ServiceLocator 询问 TSpikedShield 的实例,但我需要选择一个 IWeapon 或 IShield。但我想以两种方式使用它(或者我不想要?),例如:

spikedShield.Attack;
spikedShield.Block;

所以如果我很好理解,我必须直接创建 TSpikedShiled 的实例(我的意思是没有界面)。

function MakeSpikedShield: TSpickedShield;
begin
result := TSpickedShield.Create;
end;

有什么方法可以使用这个类,但需要自动免费?

(如果接口(interface)可以实现多接口(interface)就没有问题,但在delphi中是不允许的)

编辑:也许是这样想的?

ISpikedSield = interface
function AsWeapon: IWeapon;
function AsShield: IShield;
end;
TSpikedShield = class(TInterfacedObject, ISpikedShield)

最佳答案

There won't be problem if interfaces could implement multi interfaces but it's not allowed in Delphi

这就是问题的确切原因。

我会制作一个ISpikedShield 接口(interface),它具有IWeaponIShield 的方法,并确保每个实现 的类ISpikedShield 还显式实现了 IWeaponIShield(这是编译器在 C# 中基本上为您所做的,例如,一个接口(interface)可以从多个其他接口(interface)继承)。

然后您不能将 ISpikedShield 分配给 IWeaponIShield 但使用 as 运算符将起作用,因为背后的类实现了它们。

但是我不确定您的架构中是否没有误解,因为如果您进一步思考,将不会有一个类将 ISpikedShield 作为依赖项,而是将 IWeapon 和/或 IShield。然后,一些游戏代码会检查您的 IShield 是否支持 ICanAttack,以便在您可以使用 IWeapon 进行的攻击之外进行额外的攻击。<​​/p >

关于delphi - Spring4D中如何使用多接口(interface)类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38014572/

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