1

BaseRobot というクラスがあります。次のコードを含む:

//=== Defines the possible orientation of the robot.
//=== Note the order is important to allow cycling to be performed in a meaningful manner.
public enum Compass
{
    North, East, South, West
};

//=== The basic robot.
public class BaseRobot
{
    //--- The behaviour properties that were identified, together with associated state.
    //--- The robot identification number.
   private int mId;
   public int id
   {
       get { return mId; }
   }

   //--- the direction in which the robot is currently facing.
   private Compass mOrientation;
   public Compass Orientation
   {
       get { return mOrientation; }
       set { mOrientation = value; }
   }

   //--- The robot's current position.
   private Point mPosition;
   public Point Position
   {
       get { return mPosition; }
   }


   //--- the robot's home position, where it was originally created.
   public Point mHome;
   public Point Home
   {
       get { return mHome; }
   }

    //--- Turn the orientation left (anti-clockwise) or right (clockwise).
    //--- Implementation relies on the N, E, S, W ordering of the enumeration values to allow the arithmetic to work.

    public void TurnLeft()
    {
        --mOrientation;
        if (mOrientation < 0) mOrientation = Compass.West;
    } // end turnLeft method.    

    public void TurnRight()
    {
        mOrientation = (Compass)(((int)mOrientation + 1) % 4);
    } // end turnRight method.

    //--- Move one unit forward in the current orientation.
    public void Move()
    {
        switch (mOrientation)
        {
            case Compass.North: mPosition.Y++; break;
            case Compass.East: mPosition.X++; break;
            case Compass.South: mPosition.Y--; break;
            case Compass.West: mPosition.X--; break;
        }
    } // end Move method.

    //--- Constructor methods.
    public BaseRobot(int aId)
    {
        mId = aId;
        mHome.X = 0;
        mHome = new Point(0, 0);
        mPosition = mHome;
    }
    public BaseRobot(int aId, int aX, int aY)
    {
        mId = aId;
        mHome = new Point(aX, aY);
        mPosition = mHome;
    } // end BaseRobot constructor methods.
} 

プログラム クラスでは、このコードからオブジェクト、メソッド、およびプロパティを呼び出して、ロボットのホーム、向き、位置などのロボットのステータスに関する情報を表示しようとしています。次のようなものを表示するコンソールを探しています。

ロボットのホームは <0,0> 北向きで、現在 <0,0> にあります

これを達成する方法についてのアイデアはありますか?

4

3 に答える 3

1

まず、 Auto-Implemented Propertiesについて読むことをお勧めします。これにより、コードは次のようになります。

public Point Home { get; private set; }
public Point Position { get; private set; }
public Compass Orientation { get; private set; }

ロボットを文字列にフォーマットする作業に戻ります。ToString()ロボット クラスのメソッドをオーバーライドできます。

public override string ToString()
{
   return String.Format("Robot has home at {0} It is facing {1} and is currently at {2}",
                        mHome, mOrientation, mPosition);
}

または、単純にロボット インスタンスを次のメソッドに渡します。

public void WriteToConsole(BaseRobot robot)
{
   Console.WriteLine("Robot has home at {0} It is facing {1} and is currently at {2}",
                     robot.Home, robot.Orientation, robot.Position);
}

注: デフォルトでは System.Drawing.Point クラスは string に変換されます{X=42,Y=8}。次のようにフォーマットする必要がある場合は<42,8>、次のように X と Y の値を手動で指定する必要があります。

String.Format("Robot has home at <{0},{1}> It is facing {2} and is currently at <{3},{4}>", 
              Home.X, Home.Y, Orientation, Position.X, Position.Y);

または、Point が独自のクラスである場合は、そのToString()メソッドをオーバーライドするだけです。

return String.Format("<{0},{1}>", X, Y);
于 2013-08-08T09:14:06.720 に答える
0

Console.WriteLine を試して、クラス メソッドを呼び出して引数値を取得します。詳細については、こちらを参照してください。

http://msdn.microsoft.com/en-us/library/aakt1eab.aspx

于 2013-08-08T09:15:07.093 に答える
0

フォーマット文字列を使用すると、これを簡単に実現できます。

次のように、Console.Writelineを使用できます。

// Assumes a Robot r exists already
Console.Writeline("Robot has home at <{0},{1}> and is facing {2} and is currently at <{3},{4}>", r.Home.X, r.Home.Y, r.Orientation, r.Position.X, r.Position.Y);

ToString() のオーバーライドは、これを行う別の方法です。

public override string ToString(){
    return string.Format("Robot has home at <{0},{1}> and is facing {2} and is currently at <{3},{4}>", Home.X, Home.Y, Orientation, Position.X, Position.Y);
}

ただし、ここで ToString() をオーバーライドすることは正しくないようです。実際には、ToString() が提供する必要がある「ロボットの文字列表現」ではないロボットに関するステータス情報を表示しているためです。このタイプの情報を取得するには、上記の Console.Writeline メソッドを使用するか、Robot に文字列の Status プロパティを設定します。

于 2013-08-08T09:15:08.780 に答える