如何在c#中创建和运行同一个类的多个对象?

时间:2014-02-08 12:56:28

标签: c# class

在我的程序中,我正在创建在屏幕上移动的PictureBox。我想这样做,以便用户可以根据需要创建尽可能多的这些内容。为此,我创建了一个类,它在创建后被分配给一个图片框并控制它的移动。这适用于图片框,直到我创建另一个,当它不再受控制。我认为这是因为c#不允许我创建一个类的多个对象,因此结束以前的对象来创建一个新对象。这是我如何做到的:

static ArrayList cps = new ArrayList();

public void ShootCannon() {
    Image cubeImage= Image.FromFile("C:\\Users\\Stefan\\Documents\\Visual Studio 2010\\Projects\\Game1\\Game1\\Resources\\CannonCube.png");
    PictureBox cannonCube = new PictureBox();
    ScreenPanel.Controls.Add(cannonCube);
    cannonCube.Image = cubeImage;
    cannonCube.SetBounds(cannonCubeInst.X, cannonCubeInst.Y, cubeImage.Width, cubeImage.Height);
    cannonCube.BringToFront();

    cps.Add(new CubeProjectile(cannonCube));
}

CubeProjectile类是:

public class CubeProjectile
{

    static PictureBox box;

    public CubeProjectile(PictureBox box1)
    {
        box = box1;
        Timer Update = new Timer();
        Update.Interval = 1;
        Update.Tick += new EventHandler(Timer_Tick);
        Update.Start();
    }

    void Timer_Tick(object sender, EventArgs e)
    {
        Point loc = new Point(box.Location.X, box.Location.Y);
        box.SetBounds(loc.X + 1, loc.Y, box.Width, box.Height);
    }

}

2 个答案:

答案 0 :(得分:2)

您可以创建所需类的实例数。

问题是你在类中使用静态变量。无论您创建多少个实例,它只存在一次。当您创建第二个实例时,它将使用新图片框覆盖静态变量中的值。

您需要一个实例变量来为每个类的实例保存一张图片。

改变这个:

static PictureBox box;

为:

PictureBox box;

附注:一个好的做法是为类的成员指定访问级别,并且只允许那些要从类外部访问的公共访问级别。将您的成员变量设为私有可确保仅从该实例访问它:

private PictureBox box;

答案 1 :(得分:0)

在类中声明的静态变量对于该类的所有实例是通用的。因此,您传递给类的构造函数

的最新图片框会覆盖您的PictureBox框

因此,如果您使用上面的代码并致电

 CubeProjectile cb1 = new CubeProjectile(pic1);
 CubeProjectile cb2 = new CubeProjectile(pic2);

CubeProjectile的两个实例共享传递给构造函数pic2的最新图片框

相反,如果您声明没有static修饰符的变量,则该类的每个实例都有自己的PictureBox

public class CubeProjectile
{

    private PictureBox box;

    public CubeProjectile(PictureBox box1)
    {
        box = box1;
        Timer Update = new Timer();
        Update.Interval = 1;
        Update.Tick += new EventHandler(Timer_Tick);
        Update.Start();
    }

    void Timer_Tick(object sender, EventArgs e)
    {
        Point loc = new Point(box.Location.X, box.Location.Y);
        box.SetBounds(loc.X + 1, loc.Y, box.Width, box.Height);
    }

}

 CubeProjectile cb1 = new CubeProjectile(pic1);
 CubeProjectile cb2 = new CubeProjectile(pic2);

现在cb1引用了存储在内部变量pic1中的box,而cb2引用了pic2

但是,请记住,PictureBox是可能的昂贵资源(Image属性)的主机,您应该确保在不再需要时处置这些CubeProjectile实例