2016-06-24 33 views
2

我刚刚学习Spring4D,我有一个问题。 如果类实现一个接口它都清楚:如何在Spring4D中使用多接口类如何在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'); 

和IM真的很高兴现在,我有剑,我不需要释放它。

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

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>; 

我可以向服务定位为TSpikedShield的实例,但我需要选择一个IWeapon或IShield。但我想以两种方式使用它(或者我不应该想?),如:

spikedShield.Attack; 
spikedShield.Block; 

所以,如果我已了解好,我直接创建TSpikedShiled的实例(我的意思是不带网络接口)。

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

有什么方法可以使用这个类,但与automagical自由?

(不会有问题,如果接口可以实现多interfeces但其在德尔福不允许)

编辑: 也许somethink这样呢?

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

回答

6

不会有问题,如果接口可以实现多接口,但它不是在德尔福

这就是问题的确切原因不允许的。

我只想做一个ISpikedShield接口,具有IWeaponIShield并确保每一个实现ISpikedShield类也明确实现IWeaponIShield(这是编译器基本上在C#中为你所做的例子,其中一个方法接口可以继承多个其他接口)。

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

但是我不知道如果没有在你的架构一种误解,因为如果你想进一步不会有一个具有ISpikedShield的依赖,而是一个IWeapon和/或IShield类。然后一些游戏代码会检查您的IShield是否支持ICanAttack除了可以对IWeapon执行的操作之外还有其他功能。