你如何从另一个类中调用一个类中的方法?

时间:2014-02-15 16:10:53

标签: c# class object methods call

好的,我现在编辑了这篇原帖中的所有内容。我回到了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();
    }
}

3 个答案:

答案 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)

答案已在您提供的代码中。

  1. Instantiate包含您要调用的方法的类。 ClassName object = new ClassName();
  2. 使用您创建的类实例调用方法。 object.MethodName()
  3. 另一种方法是将您的方法声明为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 1ref 2ref 3。更好的是,你应该拿一本关于面向对象编程的书。