好的,我现在编辑了这篇原帖中的所有内容。我回到了visual studio 2010并创建了一个新的项目并编写了相同的代码,只是编写了最小的代码以获得我之前遇到的相同障碍。这意味着我在这里发布了ENTIRE项目代码,但它也非常简短且易读。我也提供了评论,以便更容易理解。
回顾一下:问题是我无法从Form1本身以外的任何其他类成功调用Form1.refreshScore()
public partial class Form1 : Form
{
private Enemy enemy_;
private Graphics paper_;
private bool started_;
public Form1()
{
InitializeComponent();
}
private void timer_Tick(object sender, EventArgs e)
{
pictureBox.Refresh();
}
private void pictureBox_Paint(object sender, PaintEventArgs e)
{
if (started_)
{
paper_ = e.Graphics;
enemy_.Draw(paper_);
}
}
public void refreshScore()
{
label.Text = "TEST"; //doesn't show
enemy_.color = Color.Red; //"Null Reference Exception unhandled" ?
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Space)
{
enemy_ = new Enemy(0, pictureBox.Height-20, 20, 100, 2, Color.Blue);
paper_ = pictureBox.CreateGraphics();
started_ = true; //succeeds
}
if (e.KeyCode == Keys.K)
{
enemy_.Kill();
enemy_.color = Color.Green; //succeeds.
}
}
}
class Enemy
{
private float x_;
private float y_;
private float diameter_;
private float health_;
private float walkSpeed_;
private Color color_;
private Form1 form_ = new Form1();
//Overloader
public Enemy()
{
x_ = 1;
y_ = 50;
diameter_ = 20;
walkSpeed_ = 1;
health_ = 100;
color_ = Color.Blue;
}
//Constructor, called in Form1, keydown event ("Space")
public Enemy(float x, float y, float diameter, float health, float walkSpeed, Color color)
{
x_ = x;
y_ = y;
diameter_ = diameter;
health_ = health;
walkSpeed_ = walkSpeed;
color_ = color;
}
//getter/setter for 'color' property
public Color color
{
get { return color_; }
set { color_ = value; }
}
public void Draw(Graphics paper)
{
SolidBrush brush = new SolidBrush(color_);
paper.FillRectangle(brush, x_,y_,x_ + diameter_, y_ + diameter_);
}
//called in Form1 under KeyDown event ("K")
public void Kill()
{
form_.refreshScore();
}
}
答案 0 :(得分:1)
您必须将static
添加到类方法
public class Class1
{
public static void MyMethod(float x)
{
return x*x ;
}
}
你可以这样称呼你的方法:
float y = Class1.MyMethod(5.24);
答案 1 :(得分:1)
我假设你有一个WinForms应用程序,而Form1
是你项目中创建的默认表单类。
在这种情况下,可能发生的是您的应用程序主方法是创建Form1
的实例并显示它。但是,您的Enemy
类正在创建自己的Form1
类实例:
Form1 form1 = new Form1();
这与正在显示的实例完全不同。您需要为Enemy
提供正在显示的实例。也许最简单的方法是让Form1
创建Enemy
的实例并将this
传递给它。例如:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
_enemy = new Enemy( this );
}
private Enemy _enemy;
}
然后你的Enemy
课程看起来像这样:
public class Enemy
{
public Enemy( Form1 form )
{
_form1 = form;
}
// DON'T initialize this with new Form1();
private Form1 _form1;
}
现在,当您创建Form1
时,它会创建一个Enemy
的实例,然后会获得对该表单的引用。
答案 2 :(得分:0)
答案已在您提供的代码中。
ClassName object = new ClassName();
object.MethodName()
。另一种方法是将您的方法声明为static
。如果将方法声明为静态,则在调用方法之前不需要实例化类(即不执行步骤1)。例如:
public class Class1
{
public static void Method1()
{
//some code
}
}
public class Class2
{
Class1.Method1(); //you do not need to instantiate the class if your method is static
}
PS:如果您将方法声明为static
但尝试使用类的实例(object.MethodName
)调用该方法,则会收到编译器错误,指出您不应使用实例调用静态方法。
我建议您仔细阅读这些参考资料,以便更好地理解:ref 1,ref 2,ref 3。更好的是,你应该拿一本关于面向对象编程的书。