【问题标题】:How use multi interface class in Spring4D如何在 Spring4D 中使用多接口类
【发布时间】:2016-10-27 03:25:25
【问题描述】:

我刚刚学习 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');

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

但如果类实现了两个或更多接口:

    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;

除了自动免费之外,还有什么方法可以使用这个类?

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

编辑: 也许有人会这样想?

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

【问题讨论】:

    标签: delphi interface spring4d


    【解决方案1】:

    接口可以实现多接口是没有问题的,但在Delphi中是不允许的

    这就是问题的确切原因。

    我将只创建一个具有IWeaponIShield 方法的ISpikedShield 接口,并确保实现ISpikedShield 的每个类也显式实现IWeaponIShield(这就是编译器基本上会在 C# 中为您服务,例如一个接口可以从多个其他接口继承)。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多