Delphi 如何在Spring4D中使用多接口类

Delphi 如何在Spring4D中使用多接口类,delphi,interface,spring4d,Delphi,Interface,Spring4d,我正在学习Spring4D,我有一个问题。 如果类仅实现一个接口,则其全部清除: IWeapon = interface ['{E679EDA6-5D43-44AD-8F96-3B5BD43A147B}'] procedure Attack; end; TSword = class(TInterfacedObject, IWeapon) public procedure Attack; end;

我正在学习Spring4D,我有一个问题。 如果类仅实现一个接口,则其全部清除:

    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');
所以,如果我不理解,我必须直接创建TSpikedShiled的实例(我的意思是没有接口)

有没有办法使用这个类,但与自动免费

(如果接口可以实现多个接口,则不会有问题,但在delphi中不允许)

编辑: 也许有人会这么想

ISpikedSield = interface
    function AsWeapon: IWeapon;
    function AsShield: IShield;
end;
TSpikedShield = class(TInterfacedObject, ISpikedShield)
如果接口可以实现多个接口,就不会有问题,但在Delphi中是不允许的

这就是问题的确切原因

我只需要创建一个
ISpikedShield
接口,该接口具有
IWeapon
IShield
方法,并确保实现
ISpikedShield
的每个类也显式实现
IWeapon
IShield
(这是编译器在C语言中基本上为您所做的工作,例如,一个接口可以从多个其他接口继承)

然后不能将
ISpikedShield
分配给
IWeapon
IShield
但使用as操作符将起作用,因为后面的类实现了它们

但是,我不确定您的架构中是否存在误解,因为如果您进一步思考,将不会有一个类将
ISpikedShield
作为依赖项,而是
IWeapon
和/或
IShield
。一些游戏代码会检查您的
IShield
是否支持
ICanAttack
进行攻击除了您可以使用
IWeapon
进行的操作之外,还可以进行其他操作

spikedShield.Attack;
spikedShield.Block;
function MakeSpikedShield: TSpickedShield;
begin
    result := TSpickedShield.Create;
end;
ISpikedSield = interface
    function AsWeapon: IWeapon;
    function AsShield: IShield;
end;
TSpikedShield = class(TInterfacedObject, ISpikedShield)