如何在c#中创建和运行同一类的多个对象?
在我的程序中,我正在创建在屏幕上移动的图片框。我想让它,让用户可以创建尽可能多的这些他们想要的。为此,我创建了一个类,该类在创建picturebox后分配给它,并控制它的移动。这适用于picturebox,直到我创建另一个picturebox时,它不再受控制。我认为这是因为c#不允许我创建一个类的多个对象,因此会结束以前的对象来创建一个新对象。我是这样做的:如何在c#中创建和运行同一类的多个对象?,c#,class,C#,Class,在我的程序中,我正在创建在屏幕上移动的图片框。我想让它,让用户可以创建尽可能多的这些他们想要的。为此,我创建了一个类,该类在创建picturebox后分配给它,并控制它的移动。这适用于picturebox,直到我创建另一个picturebox时,它不再受控制。我认为这是因为c#不允许我创建一个类的多个对象,因此会结束以前的对象来创建一个新对象。我是这样做的: static ArrayList cps = new ArrayList(); public void ShootCannon() {
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));
}
立方体投影的类别是:
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);
}
}
类中声明的静态变量对于该类的所有实例都是公共的。因此,您的PictureBox框将被传递给类的构造函数的最新PictureBox覆盖 因此,如果您使用上面的代码并调用
CubeProjectile cb1 = new CubeProjectile(pic1);
CubeProjectile cb2 = new CubeProjectile(pic2);
cubeproject的两个实例都共享传递给构造函数的最新pictureboxpic2
相反,如果在没有静态修饰符的情况下声明变量,则该类的每个实例都有自己的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
的引用,而cb2引用了pic2
但是,请记住,PictureBox是一个可能昂贵资源(Image属性)的宿主,您应该确保在不再需要时处置这些CubeProject实例您可以创建所需的类实例数量
问题是您在类中使用的是静态变量。这只存在一次,无论创建多少实例。创建第二个实例时,它将用新图片框覆盖静态变量中的值
您需要一个实例变量来为类的每个实例保存一个图片bx
更改此项:
static PictureBox box;
致:
旁注:一个好的做法是为类成员指定访问级别,并且只公开那些您希望从类外部访问的成员。将成员变量设置为私有可确保仅从该实例访问该变量:
private PictureBox box;
“c#不允许我创建一个类的多个对象”你在说什么?PictureBox不是单例。修复您的私人静态图片盒。
private PictureBox box;