2016-11-08 4 views
0

は誰かが確認できたジェネリック型の使用状況:私の下のアプローチが正しいか、より良い代替手段があるかどうか

Tiger : Animal<Claw> 
{ 
    protected override void UseWeapon(Claw claw) 
    { 
     // logic here 
    } 

    protected override void GetWeapon() 
    { 
     // logic here to populate props & return Claw(); 
    } 
} 
:例えばのために

Tiger : Animal<Claw> 
Hyena : Animal<Teeth> 
Eagle : Animal<Beak> 

:私のような実装を持つことができるように

// An interface 
IAnimal 
{ 
    pubilc void Hunt(); 
} 

// An abstract class 
Animal<T> : IAnimal 
{ 
    public void Hunt() 
    { 
     UseWeapon(T); 
    } 

    protected abstract T GetWeapon(); 
    protected abstract void UseWeapon(T weapon); 
} 

私は電話することができます:

IAnimal animal = GetRandomAnimal(); // OR GetTiger(); 
animal.Hunt() 
+3

'Claws'と' Teeth'を武器に使う 'Bear'を実装する必要がある場合はどうなりますか? –

+1

このコードは機能しません。 'public void Hunt(){UseWeapon(T);) } ' –

+0

ええ、私は@DmitryBychenkoに同意するだろう、それはむしろ動物ごとに利用可能なオプションを制限するようだ – Icepickle

答えて

1

私はむしろDIで簡単に動作します。このアプローチを使用します。

interface IAnimal 
{ 
    pubilc void Hunt(); 
} 

interface IWeapon 
{ 
} 

Animal : IAnimal 
{ 
    IWeapon _weapon; 

    public void Animal(IWeapon weapon) 
    { 
     _weapon = weapon; 
    } 

    public void Hunt() 
    { 
     UseWeapon(_weapon); 
    } 

    protected abstract void UseWeapon(IWeapon weapon); 
} 

あなたは複数の武器を必要とする場合は、あなただけのコンストラクタでIEnumerable<IWeapon>を注入し、適切なロジックを変更。

関連する問題