私はSpring4Dを学んでいます.1つの質問があります。クラスが 1 つのインターフェイスのみを実装する場合、すべて明確です。
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');
そして今、私は本当に幸せです。私は剣を持っていて、それを解放する必要はありません.
ただし、クラスが 2 つ以上のインターフェイスを実装している場合:
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 のインスタンスを ServiceLocator に要求できますが、IWeapon または IShield のいずれかを選択する必要があります。しかし、次のような 2 つの方法で使用したい (または使用したくない場合)。
spikedShield.Attack;
spikedShield.Block;
したがって、よくわからない場合は、TSpikedShiled のインスタンスを直接作成する必要があります (つまり、インターフェイスなしで)。
function MakeSpikedShield: TSpickedShield;
begin
result := TSpickedShield.Create;
end;
このクラスを使用する方法はありますが、自動魔法の無料で使用できますか?
(インターフェースがマルチインターフェースを実装できても問題はありませんが、デルファイでは許可されていません)
編集済み:多分そのように考えていますか?
ISpikedSield = interface
function AsWeapon: IWeapon;
function AsShield: IShield;
end;
TSpikedShield = class(TInterfacedObject, ISpikedShield)