我剛剛學習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)