Spring4D中如何使用多接口class
How use multi interface class in Spring4D
我刚学Spring4D,有一个问题。
如果 class 只实现一个接口,那就很清楚了:
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');
我现在真的很开心,我有剑,我不需要释放它。
但是如果class实现了两个或更多接口:
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;
有什么方法可以使用这个 class 但是自动免费?
(如果接口可以实现多接口就没有问题,但在delphi中不允许)
已编辑:
也许是这样想的?
ISpikedSield = interface
function AsWeapon: IWeapon;
function AsShield: IShield;
end;
TSpikedShield = class(TInterfacedObject, ISpikedShield)
There won't be problem if interfaces could implement multi interfaces but it's not allowed in Delphi
这就是问题的确切原因。
我只想制作一个 ISpikedShield
接口,它具有 IWeapon
和 IShield
的方法,并确保每个 class 也实现了 ISpikedShield
显式实现 IWeapon
和 IShield
(这是编译器在 C# 中基本上为您执行的操作,例如,一个接口可以从多个其他接口继承)。
然后您不能将 ISpikedShield
分配给 IWeapon
和 IShield
,但使用 as 运算符将起作用,因为后面的 class 实现了它们。
但是我不确定您的体系结构中是否没有误解,因为如果您进一步思考,就不会有 class 具有 ISpikedShield
作为依赖项,而是 IWeapon
and/or IShield
。然后一些游戏代码会检查你的 IShield
是否支持 ICanAttack
除了你可以用你的 IWeapon
.
可以做的额外打击。
我刚学Spring4D,有一个问题。 如果 class 只实现一个接口,那就很清楚了:
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');
我现在真的很开心,我有剑,我不需要释放它。
但是如果class实现了两个或更多接口:
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;
有什么方法可以使用这个 class 但是自动免费?
(如果接口可以实现多接口就没有问题,但在delphi中不允许)
已编辑: 也许是这样想的?
ISpikedSield = interface
function AsWeapon: IWeapon;
function AsShield: IShield;
end;
TSpikedShield = class(TInterfacedObject, ISpikedShield)
There won't be problem if interfaces could implement multi interfaces but it's not allowed in Delphi
这就是问题的确切原因。
我只想制作一个 ISpikedShield
接口,它具有 IWeapon
和 IShield
的方法,并确保每个 class 也实现了 ISpikedShield
显式实现 IWeapon
和 IShield
(这是编译器在 C# 中基本上为您执行的操作,例如,一个接口可以从多个其他接口继承)。
然后您不能将 ISpikedShield
分配给 IWeapon
和 IShield
,但使用 as 运算符将起作用,因为后面的 class 实现了它们。
但是我不确定您的体系结构中是否没有误解,因为如果您进一步思考,就不会有 class 具有 ISpikedShield
作为依赖项,而是 IWeapon
and/or IShield
。然后一些游戏代码会检查你的 IShield
是否支持 ICanAttack
除了你可以用你的 IWeapon
.