我应该在哪里/如何创建我的班级实例?

时间:2013-06-03 22:12:41

标签: c#

我是新手程序员。我有一个名为GravCalc的类,它继承自我的表单类Main。里面有很多处理不同控件的方法。这是一个代码示例。

public class GravCalc : Main
    {
        private static float engineer = 1.0f;

        public void ShowEngineer()
        {
            GravCalc.engineer = 1.1f;
            gravEngineerLabel.Visible = true;
            gravEngineerLine.Visible = true;
        }
    };

我会将这些方法和类设为静态,但之后我无法继承Form或对控件进行操作,因为它们是非静态的。

在这种情况下,我必须创建我的类的实例。所以我在GravCalc myGravCalc = new GravCalc();课程中写了Main

一切都在编译,但是当我启动程序时,会创建我的类的多个实例,直到它达到最大堆栈帧数,因此System.StackOverflowException发生。

我做错了什么?

修改

我想要做的是将所有方法和变量与一个面板组合成一个类。如果它可以是静态的,那将是完美的。我已经让它继承Main来访问我的控件,但是你意识到这不是我想要的。

那么有可能创建一个可以对控件进行操作的类吗?或者我应该在那个Form类中添加一些东西吗?

2 个答案:

答案 0 :(得分:5)

GravCalc IS Main ...所以如果在Main中创建GravCalc,你再次制作一个Main,然后再制作一个main,然后最终耗尽堆栈。

您要做的是找到创建原始主菜单的位置并将其替换为GravCalc并从主菜单中取出new GravCalc

答案 1 :(得分:2)

您应该将对类中需要使用的控件的引用传递给GravCalc的构造函数,而不是从Main继承以访问控件。

public class GravCalc
{
    private ControlType _control1;
    private ControlType _control2;

    public GravCalc(ControlType control1, ControlType control2)
    {
        _control1 = control1;
        _control2 = control2
    }

    private static float engineer = 1.0f;

    public void ShowEngineer()
    {
        GravCalc.engineer = 1.1f;
        gravEngineerLabel.Visible = true;
        gravEngineerLine.Visible = true;
    }
};
相关问题