如何在这个例子中正确使用实例?

How to properly use instances in this example?

我有多个 classes,我想使用其他 classes 中的功能。但我遇到了一个问题,你可能知道如何解决它。

Class 1 开头:

Master master = new Master(ip1.Text);
master.Show();

Master slave = new Master(ip2.Text);
slave.Show();

Arena arena = new Arena();
arena.Show();

Class 2师傅:

Arena arena = new Arena();

public Master(string ip) //Inicio
{
    InitializeComponent();

    _droneClient = new DroneClient("192.168.1." + ip);
    ip_drone = "192.168.1." + ip; 
    Point p2 = arena.posicao_desej();
    posicao_desejada = p2;

    public string ip_dron()
    {
         return ip_drone;
    }

Class 3 竞技场:

Master master = new Master(""); //What do I insert here? I dont want to iniciate it again

string ip = master.ip_dron();
ip_drone = ip;

问题出在 Master master = new Master(""); 如果我将其删除,一切正常,但我无法使用 class 中的任何内容。如果我这样使用,一旦 Master 和 Arena 表格打开,问题就会崩溃。如何正确实例化实例?

错误:

Make sure you do not an infinite loop or infinite recursion.

编辑: 我的问题是,由于 class Inicio 将从 Master 打开两个不同的实例,因此它将使用两个不同的 ips。当我运行这两个实例时,ip会先ip1.text再ip2.text。但是由于它们同时打开 return ip_drone 只会 return 最后一个值(在这种情况下 ip2.text)

   public Master(string ip) //Inicio
    {
        InitializeComponent();

        _droneClient = new DroneClient("192.168.1." + ip);
        ip_drone = "192.168.1." + ip;  
    }

   public string ip_dron()
    {
        return ip_drone;
    }

你的问题中缺少一些代码,但对我来说它看起来像这样:

在每个新的 Master class 中你初始化一个新的 Arena 实例:

Arena arena = new Arena();

然后,在每个新的 Arena class 中你初始化一个新的 Master class:

Master master = new Master("");

所以你似乎在初始化无限量的 ArenaMaster classes。每一个新的 Arena 都会有一个新的 Master,而每一个新的 Master 都会有一个新的 Arena.


如果您想使用 ArenaMaster class 中的方法而不必一直创建实例,您应该将它们声明为 public static.这使得它们无需声明 class 实例即可访问。

例如:

public class Arena
{
    public static void DoSomething()
    {
        //Do something...
    }
}

public class Master
{
    public static void AnotherStaticMethod()
    {
        //Do something here too...
    }
}

然后您将能够通过调用 Arena.DoSomething()Master.AnotherStaticMethod().

来访问这些方法

如果我现在对问题的理解正确,我认为您需要为 Arena class 提供您想使用的 Master 的特定实例。目前,您正在分别在每个 classes 中创建全新的 Master 和 Arena 实例,这会导致无限循环(Master 创建和 Arena,它创建一个 Master,它创建和 Arena,等等。等等。永远)。

我认为这可能会解决问题:

Class 1 开头:

Master master = new Master(ip1.Text);
Master slave = new Master(ip2.Text);
Arena arena = new Arena(master, slave); //here we pass specific instances of Master to the Arena class for later use.
arena.Show();

Class 2师傅:

class Master
{
  public Master(string ip)
  {
    InitializeComponent();
    _droneClient = new DroneClient("192.168.1." + ip);
    ip_drone = "192.168.1." + ip; 
    Point p2 = arena.posicao_desej();
    posicao_desejada = p2;
}

  public string ip_dron()
  {
     return ip_drone;
  }
}

Class 3 竞技场:

class Arena
{
  private Master master;
  private Master slave;

  public Arena(Master master, Master slave) //hint: maybe Master is not such a good name for the class...but that's another story
  {
   //here we assign the instances passed in to our internal variables, so we can reference them within the Arena class itself.
    this.master = master;
    this.slave = slave;
  }
  //and then for example (this may not be what you really want to do):
  public string Show()
  {
    string masterIP = this.master.ip_dron();
    string slaveIP = this.slave.ip_dron();
    return "master IP: " + masterIP + ", Slave IP: " + slaveIP;
  }
}