2016-06-24 70 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執行的操作之外還有其他功能。