2

私は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)
4

1 に答える 1