【问题标题】:How to write temporary results in a tostring method to give an overview afterwards如何在 tostring 方法中编写临时结果以便之后进行概述
【发布时间】:2017-07-16 08:01:29
【问题描述】:

我对编程很陌生,我对我的代码有点卡住了。 我正在对机器人进行编程,在每次位置切换后,我都想将他的当前位置写入 ToString 方法,以便以后查看。我不确定 ToString 方法是否正确。也许我需要一个列表或数组? 我不是在寻求解决方案,而是在帮助我解决这个问题。 谢谢您的帮助! 请参阅下面的代码:

enum Richting
{
    Boven,
    Onder,
    Links,
    Rechts,
}
class Positie
{
    public int X { get; set; }
    public int Y { get; set; }
    public Positie (int x, int y)
    {
        X = x;
        Y = y;
    }
}
class Spoor
{
    public Robot Robot { get; set; }
    public new string ToString()
    {
        return Robot.Positie.X + "-" + Robot.Positie.Y;
    }
    public void ToonSpoor()
    {
        ToString();
    }
}
class Robot
{
    public Positie Positie { get; set; }
    public string Naam { get; set; }
    public Robot (string naam, Positie positie1)
    {
        Naam = naam;
        Positie = positie1;
    }
    public Robot (string naam)
    {
        Naam = naam;
        this.Positie = new Positie(0,0);
    }
    public Richting Richting;
    public virtual void Stap()
    {
        switch (Richting)
        {
            case Richting.Boven:    Positie.Y++; Spoor.ToString();
                break;
            case Richting.Onder:    Positie.Y--; Spoor.ToString();
                break;
            case Richting.Links:    Positie.X--; Spoor.ToString();
                break;
            case Richting.Rechts:   Positie.X++; Spoor.ToString();
                break;
        }
    }
    public virtual void Stap(int aantalStappen)
    {
        for (int i = 0; i < aantalStappen; i++)
        {
            switch (Richting)
            {
                case Richting.Boven:
                    Positie.Y++;
                    break;
                case Richting.Onder:
                    Positie.Y--;
                    break;
                case Richting.Links:
                    Positie.X--;
                    break;
                case Richting.Rechts:
                    Positie.X++;
                    break;
            }
        }
    }
    public virtual void Draai()
    {
        switch (Richting)
        {
            case Richting.Boven: Richting = Richting.Rechts;
                break;
            case Richting.Onder: Richting = Richting.Links;
                break;
            case Richting.Links: Richting = Richting.Boven;
                break;
            case Richting.Rechts: Richting = Richting.Onder;
                break;
        }
    }
    public Spoor Spoor { get; set; }
}
class SpecialeRobot : Robot
{
    public SpecialeRobot (string naam) : base("")
    {
        Naam = naam;
        this.Positie = new Positie(0, 0);
    }
    public SpecialeRobot(string naam, Positie positie1) :base("")
    {
        Naam = naam;
        Positie = positie1;
    }
    public override void Stap()
    {
        switch (Richting)
        {
            case Richting.Boven:
                Positie.Y = Positie.Y + 2;
                break;
            case Richting.Onder:
                Positie.Y = Positie.Y - 2;
                break;
            case Richting.Links:
                Positie.X = Positie.X - 2;
                break;
            case Richting.Rechts:
                Positie.X = Positie.X + 2;
                break;
        }
    }
    public override void Stap(int aantalStappen)
    {
        for (int i = 0; i < aantalStappen; i++)
        {
            switch (Richting)
            {
                case Richting.Boven:
                    Positie.Y++;
                    break;
                case Richting.Onder:
                    Positie.Y--;
                    break;
                case Richting.Links:
                    Positie.X--;
                    break;
                case Richting.Rechts:
                    Positie.X++;
                    break;
            }
        }
    }
    public override void Draai()
    {
        switch (Richting)
        {
            case Richting.Boven:
                Richting = Richting.Rechts;
                break;
            case Richting.Onder:
                Richting = Richting.Links;
                break;
            case Richting.Links:
                Richting = Richting.Boven;
                break;
            case Richting.Rechts:
                Richting = Richting.Onder;
                break;
        }
    }
}
class Program 
{
    static void Main(string[] args)
    {
        // Aanmaken van een positie-object
        Positie positie1 = new Positie(2, 3);
        // Aanmaken van een robot
        Console.WriteLine("1 ------------------------------------------");
        Robot robot1 = new Robot("Bart", positie1);
        // ----controles uitvoeren
        Console.WriteLine(robot1.Naam == "Bart");
        Console.WriteLine(robot1.Positie.X == 2);
        Console.WriteLine(robot1.Positie.Y == 3);
        Console.WriteLine(robot1.Richting == Richting.Boven);
        Console.WriteLine("11 ------------------------------------------");
        robot1.Stap();
        robot1.Stap();
        robot1.Stap();
        robot1.Spoor.ToonSpoor();       // 2 - 3 -> 2 - 4 -> 2 - 5

【问题讨论】:

    标签: c# tostring


    【解决方案1】:

    ToString 非常适合您的情况。但是,最好覆盖它而不是使用“新”关键字隐藏。所以最好写:

    public override string ToString()
    {
        return Robot.Positie.X + "-" + Robot.Positie.Y;
    }
    

    您还可以查看this 可能有用的问题。

    【讨论】:

    • 谢谢,但是当我这样做(也使用 new)时,我收到一条错误消息,我需要使用 new 关键字来创建对象的实例。我不知道我需要在哪里做这个
    • 当然你需要实例化你的Spoor类。这应该在您想要使用课程的地方完成。类只能处理信息,最后你必须有另一个地方向用户显示输出,你可以在其中创建Spoor 的实例并使用它的ToString() 方法。
    【解决方案2】:

    如果我正确理解了这个问题,您希望记录机器人访问过的位置 - 即每次调用 Robot.Stap() 后的位置

    实现此目的的一种方法是添加访问位置列表,例如

    private List&lt;Positie&gt; visitedPositions;

    Robot 类并在每次调用Robot.Stap() 后添加机器人当前位置的记录

    然后你可以通过输出这个列表的内容来获取机器人的路径信息。

    class Robot
    {
        private List<Positie> visitedPositions = new List<Positie>();
        public void PrintPositions () {
            foreach (var pos in visitedPositions) {
                Console.WriteLine (pos.X + " " + pos.Y);
            }
        }
        ...
    
        public virtual void Stap()
        {
            switch (Richting)
            {
                case Richting.Boven:    Positie.Y++;
                break;
                case Richting.Onder:    Positie.Y--;
                break;
                case Richting.Links:    Positie.X--;
                break;
                case Richting.Rechts:   Positie.X++;
                break;
            }
            visitedPositions.Add (new Positie (Positie.X, Positie.Y));
    
        }
        public virtual void Stap(int aantalStappen)
        {
            ...
            visitedPositions.Add (new Positie (Positie.X, Positie.Y));
        }
    
    }
    
    class Program 
    {
        static void Main(string[] args)
        {
            ...
            Robot robot1;
            ...
    
            robot1.Stap ();
            robot1.PrintPositions ();
        }
    }
    

    【讨论】:

    • 比我必须更改程序。我想把智慧留在课堂上,而不是在课堂之外。
    • 我添加了一些代码大纲,希望对您有所帮助:)
    • 谢谢,帮了大忙!
    【解决方案3】:

    为什么不在你的 Program 类中添加一个私有变量并使用你的类 Positie

    您可以在 Program 中的任何位置添加它 私人职位;

    然后你可以在你的Program 中设置position 类似的东西:

    class Program 
    {
        private Positie position;
    
        static void Main(string[] args)
        {
            // Aanmaken van een positie-object
            Positie positie1 = new Positie(2, 3);
            // Aanmaken van een robot
            Console.WriteLine("1 ------------------------------------------");
            Robot robot1 = new Robot("Bart", positie1);
            // ----controles uitvoeren
            Console.WriteLine(robot1.Naam == "Bart");
            Console.WriteLine(robot1.Positie.X == 2);
            Console.WriteLine(robot1.Positie.Y == 3);
            Console.WriteLine(robot1.Richting == Richting.Boven);
            Console.WriteLine("11 ------------------------------------------");
            robot1.Stap();
            position = robot1.Positie; // <- this line
            robot1.Stap();
            robot1.Stap();
            robot1.Spoor.ToonSpoor();       // 2 - 3 -> 2 - 4 -> 2 - 5
    

    因此,要访问您的私有变量,您可以直接调用position

    Console.WriteLine(position.X);
    Console.WriteLine(position.Y);
    Console.WriteLine("Robot position: (" + position.X.Tostring() + "," + position.X.Tostring() + ")");
    

    编辑:我刚刚意识到声明变量position应该在Program

    【讨论】:

    • 我想远离这个程序。这仅用于测试。智力应该在课堂上。
    猜你喜欢
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多