16

これが私がこれまでに持っているものです:

namespace Strategy
{
    interface IWeaponBehavior
    {
        void UseWeapon();
    }
}

namespace Strategy
{
    class Knife : IWeaponBehavior
    {
        public void UseWeapon()
        {
            Console.WriteLine("You used the knife to slash the enemy! SLASH SLASH!");
        }
    }
}

namespace Strategy
{
    class Pan : IWeaponBehavior
    {
        public void UseWeapon()
        {
            Console.WriteLine("You use the pan! 100% Adamantium power! BONG!");
        }
    }
}

Character.cs スーパークラスがあるとします。子クラスがより具体的になるように、そのスーパークラスが武器の動作をどのように実装できますか。

namespace Strategy
{
    class Character
    {
        public IWeaponBehavior weapon;

        public Character(IWeaponBehavior specificWeapon)
        {
            weapon = specificWeapon;
        }        
    }
}

namespace Strategy
{
    class Thief : Character
    {

    }
}

どうすればこれを実装できますか? 実際のコードがどうあるべきかについて非常に混乱しています。

質問が多すぎるかもしれませんが、実際のコードを書いて研究できるようにしていただけると助かります。コードを見て学ぶ。:P 多くの人がこの質問から恩恵を受けることができます.

4

7 に答える 7

26

クラスで依存性注入を使用しCharacterますか?

public class Character
{
    public Character(IWeaponBehavior weapon) 
    {
        this.weapon = weapon;
    }

    public void Attack()
    {
        weapon.UseWeapon();
    }

    IWeaponBehavior weapon;
}

public class Princess: Character
{
    public Princess() : base(new Pan()) { }
}

public class Thief: Character
{
    public Thief() : base(new Knife()) { }
}

...

Princess p = new Princess();
Thief t = new Thief();

p.Attack(); // pan
t.Attack(); // knife

リクエストに応じて編集しました。

于 2010-08-10T13:55:30.350 に答える
5

いくつかの可能性があります。あなたが本当に求めているのは、「特定のキャラクターが使用する武器をどのように知る必要があるか?」ということです。

適切なタイプの武器を作成してキャラクターに注入するキャラクター ファクトリを用意するか (それは間違っているように聞こえます :))、特定のキャラクターのコンストラクターに武器の作成を任せることができます。

于 2010-08-10T13:56:05.177 に答える
3
  class Character
  {
    private IWeaponBehavior _weapon;

    // Constructor
    public Character(IWeaponBehavior strategy)
    {
      this._weapon = strategy;
    }

    public void WeaponInterface()
    {
      _weapon.UseWeapon();
    }
  }
于 2010-08-10T13:56:07.047 に答える
1

依存性注入を調べてから、制御の反転も調べてください。

TekPub には、あなたと非常によく似たサンプルを使用して、これら 2 つのアイデアに関する素晴らしい無料のエピソードがあります。これは、具体的なサンプルに役立つはずです。:-)

http://tekpub.com/view/concepts/1

ビデオのサンプル コード:

class Samurai {
  IWeapon _weapon;

  public Samurai() {
   _weapon = new Sword();
  }

  public Samurai(IWeapon weapon) {
   _weapon = weapon;
  }

  public void Attack(string target) {
    _weapon.Hit(target);
  }
}

上記は DI (IWeapon コンストラクターを使用) です。コントロールの反転を追加すると、より多くのコントロールが得られます。

IOC コンテナーを使用すると、クラス自体ではなく、インジェクションを介して IWeapon を制御できます。

このビデオでは、IOC としてNInjectを使用し、IWeapon コンストラクターを排除して、IWeapon を使用する必要があるクラスとすべてのクラスを制御して、1 つの場所/構成領域で必要なものを使用する方法を示しています。

ビデオからのサンプル:

class WarriorModule: NinjectModule {
  public override void Load() {
   Bind<IWarrior>().To<Samurai>();
   Bind<IWeapon>().To<Sword>();
}

上記の構成は、IWarrior に遭遇したときはいつでも Samurai を使用し、IWeapon に遭遇したときはいつでも Sword を使用することを NInject に伝えます。

ビデオでは、この小さな変化がどのように柔軟性を高めるかを説明しています。遠距離武器などを使用するサムリアに別のモジュールを追加します....

これらは必要に応じて変更できます。

于 2010-08-10T14:54:29.900 に答える
1
パブリック クラス キャラクター
{
    IWeaponBehavior 武器。
}

public class Princess : キャラクター
{
    武器 = new Pan();
}

public class Thief : 文字
{
    武器 = 新しいナイフ();
}
于 2010-08-10T13:57:08.397 に答える
0

すべてのキャラクターが独自の武器を持っている場合、実際に戦略パターンを使用する必要はありません。単純なポリモーフィズムを使用できます。しかし、いずれにせよ、戦略パターンはよりクリーンになる可能性があります。

武器を初期化するだけです:

public class Character
{
     IWeapenBehavior weapon;

     public Attack()
     {
          weapon.UseWeapon();
     }
}


public class Thief : Character
{
      Thief()
      {
           weapon = new Knife();
      }
}

キャラクターを制御するコードで、メソッドを呼び出すことができますAttack()

于 2010-08-10T14:00:26.500 に答える
0

C# でこのパターンを使用することに重点を置いた記事を次に示します: http://www.lowendahl.net/showShout.aspx?id=115

于 2010-08-10T13:55:22.447 に答える