1
class bishop:unit {}
class knight:unit {}
class peasant:unit {}

void Battle(unit first, unit second, byte firstAmount, byte secondAmount)
{
  System.Array sideA = System.Array.CreateInstance(first.GetType(),firstAmount);
  for(int i=0; i< firstAmount; i++) 
  { 
   sideA[i] = ???
  }
}

前回の質問で、動的配列の作成に問題がありました。ここに次のステップの問題があります。:D
このメソッドに通用するタイプ ビショップ、ナイトなど
実際、オブジェクトを初期化する方法がわかりません。sideA[i] = new first.GetType()(constructor parameters) だけを入力して理由を理解することはできませんが、これを回避する方法がわかりません

4

2 に答える 2

4

これは本当に、本当に悪いデザインです。

あなたのメソッドは、あなたが私たちに提供していないBattleクラスのインスタンスメソッドである可能性があると思います。Game

Battle次に、メソッドが動作するオブジェクトのインスタンスを作成しないことを強くお勧めします。それらを取り、戦闘アクションを実行するだけです(ライフの計算など)。

したがって、これらのオブジェクトを別の場所で作成してから、メソッドにポストするだけです。

class Game
{
    List<Bishop> bishops = new List<Bishop>() { new Bishop(..), ... };
    List<Knight> knights = new List<Knight>() { new Knight(..), ... };

    void Battle(List<Unit> first, List<Unit> second)
    {
        foreach(var f in first)
        {
            // get random unit from the second collection and attack him
            f.Attack(GetRandomKnight(second)); 
        }
    }

    public void StartBattle()
    {
        Battle(bishop, knights);
    }
}

また、正しい C# 命名を使用していることを確認してください。クラスの名前は大文字で始める必要があります。

class Unit
{
    public virtual void Attack(Unit enemy)
    {
        // default attack
        Kick(enemy);
    }

    protected Kick(Unit enemy) { ... }
}

class Bishop : Unit { }
于 2013-09-03T07:24:43.240 に答える