我刚刚学习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)
答案 0 :(得分:6)
如果接口可以实现多接口但在Delphi中不允许这样做会不会有问题
这就是问题的确切原因。
我只想创建一个ISpikedShield
接口,其中包含IWeapon
和IShield
的方法,并确保实现ISpikedShield
的每个类也明确实现IWeapon
}和IShield
(这是编译器在C#中基本上为你做的事情,例如接口可以从多个其他接口继承)。
然后,您无法将ISpikedShield
分配给IWeapon
和IShield
,但使用as运算符将起作用,因为后面的类实现了它们。
但是我不确定你的架构中是否存在误解,因为如果你进一步思考,那么它就不会成为一个ISpikedShield
作为依赖的类,而是IWeapon
和/或IShield
。然后,某些游戏代码会检查您的IShield
支持ICanAttack
是否支持IWeapon
除了您可以对$("#button").click(function () {
var pp = []
var ing = []
for (var q = 1; q <= 6; q++) {
pp[q - 1] = $('input[name=P' + (q) + ']').is(":checked");
ing[q - 1] = $('div#ingp' + (q) + '').show();
}
for (var q = 1; q <= 6; q++) {
if (pp[q - 1] == true) {
ing[q - 1];
}
}
});
执行的操作。