2016-06-24 3 views
2

私はSpring4Dを学んでいるだけで、1つの質問があります。 一つだけがそのすべてが明確インタフェースクラスを実装する場合:今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'); 

とイム本当に幸せ、私は剣を持っていると私はそれを解放する必要がいけません。

が、クラスを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を求めることができますが、私は1 IWeaponまたはISHIELDを選ぶ必要があります。しかし、私は、2つの方法でそれを使用する(または私は望んでいないでしょうか?)のようにしたい:

spikedShield.Attack; 
spikedShield.Block; 

だから私は良いundestand場合、私は(私はインターフェイスなしを意味する)を直接TSpikedShiledのインスタンスを作成する必要があります。

function MakeSpikedShield: TSpickedShield; 
begin 
    result := TSpickedShield.Create; 
end; 

このクラスを使用する方法はありますが、オートマティックフリーですか?

(そこインタフェースは、マルチinterfecesを実装することができれば問題にならないが、そのデルファイでは許可されません)

編集: は多分そのようsomethink?

ISpikedSield = interface 
    function AsWeapon: IWeapon; 
    function AsShield: IShield; 
end; 
TSpikedShield = class(TInterfacedObject, ISpikedShield) 

答えて

6

ありインタフェースは、マルチインターフェイスを実装することができれば問題になることはありませんが、問題の正確な原因であることをデルファイ

に許可されていません。

私はちょうどIWeaponIShieldのメソッドを持ってISpikedShieldインタフェースになるだろうと必ずISpikedShieldを実装するすべてのクラスが明示的IWeaponIShieldを実装することを作る(これは、コンパイラは、基本的にどこ例えばC#であなたのために何をするかですインターフェイスは複数の他のインターフェイスから継承できます)。

次に、IWeaponIShieldISpikedShieldを割り当てることはできませんが、演算子asを使用すると、後ろにあるクラスがそれらを実装するために機能します。あなたが考える場合は、さらに依存関係としてISpikedShieldではなく、むしろIWeaponおよび/またはIShieldを持つクラスがありませんので、あなたのアーキテクチャでは誤解がない場合

は、しかし、私はわかりません。いくつかのゲームコードでは、IWeaponでできることとは別に、IShieldICanAttackをサポートしているかどうかを確認します。

関連する問題