C# 创建类的实例时出现问题

C# 创建类的实例时出现问题,c#,winforms,visual-studio-2010,stack-overflow,C#,Winforms,Visual Studio 2010,Stack Overflow,我在Visual Studio 2010中创建了以下类: public class Bat : Form1 { public int BatLocation; public void draw() { Pen batPen = new Pen(Color.Black); batPen.Width = 10; playArea.DrawRectangle(batPen,

我在Visual Studio 2010中创建了以下类:

public class Bat : Form1
    {
        public int BatLocation;

        public void draw()
        {
            Pen batPen = new Pen(Color.Black);
            batPen.Width = 10;
            playArea.DrawRectangle(batPen, BatLocation, (picPlayArea.Height - 30), 50, 10);
        }
    }
但当我尝试创建该类的实例时,会出现堆栈溢出异常,建议我确保没有无限循环或无限递归。我尝试了两种不同的方法创建实例,如下所示:

Bat bottomBat;
bottomBat = new Bat();

但是当我尝试运行程序时,这两种方法都返回相同的错误。我还尝试了使用和不使用
public
修饰符的类定义

我对编程非常陌生,不知道是什么导致了这个问题。我做错什么了吗

Edit:Bat类的代码是我目前拥有的一切,还没有为它创建特定的构造函数。。。你不认为我需要吗

无论如何,以下是Form1类的全部内容:

public partial class Form1 : Form
    {
        // Define various objects for the game
        public Graphics playArea;
        Bat bottomBat = new Bat();


        public Form1()
        {
            InitializeComponent();

            // Create instances of objects
            playArea = picPlayArea.CreateGraphics();
            //bottomBat = new Bat();

            // Delegate the mouseMove event for picPlayArea
            picPlayArea.MouseMove += new MouseEventHandler(picPlayArea_MouseMove);


        }

        private void picPlayArea_MouseMove(object sender, MouseEventArgs e)
        {
            bottomBat.Location = e.X;
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            string msg = "Are you sure you want to exit?",
                   title = "Confirm Exit";

            DialogResult res = MessageBox.Show(msg, title, MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (res == DialogResult.Yes)
            {
                Environment.Exit(0);
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            // This is where most of the functionality is executed within the game
            playArea.Clear(Color.White);
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
        }
    }

通常原因是将属性与其支持变量混淆

大致如下:

public class tmp 
{ 
    private int _x; 

    ...

    public int X(x)
    {
        X = x;
    }

看来你已经以一种不可能的方式将继承和组合结合起来了。基本
Form1
类型有一个声明为派生
Bat
类型的字段。此外,它使用字段初始值设定项将其初始化为该类型的新实例。很明显,您一直都有一个海龟问题:当您创建一个
Bat
(或者一个
Form1
)时,字段初始值设定项将运行-这将创建另一个
Bat
的实例,这反过来将创建另一个
Bat
,理论上是无限的,依此类推。(实际上:直到堆栈空间用完为止)

下面是一个简单的修复程序,可以解决堆栈溢出问题,但可能不是“大局”中最合适的设计:

public class Bat 
{
   public void Draw(Graphics playArea)
   {
       ...
   }
}
请注意,此类型如何不再子类
Form1
;它直接从
System.Object
继承。现在,无论是
Form1
还是
Bat
类,在创建它们的实例时都不会显示无限递归


在不知道最终目标的情况下,很难提出最佳解决方案。我建议您考虑一下设计这些类的最佳方法。我认为您需要花一些时间学习C#编程语言、OO设计以及WinForms的细节。我认为您实际上是想覆盖这里的虚拟方法。

您有一个简单的问题

您的类Bat是从Form1派生的,在Form1中您创建了一个新的Bat实例,该实例又基于Form1,因此创建了一个新的Bat实例。。。。所以它会重复,直到堆栈空间用完为止

一般来说,Form1可能不应该知道Bat类,所有需要知道Bat的代码都应该在Bat类中。但是,在特殊情况下,您可以这样解决此问题:

partial class Form1
{
  public Form1(Bat _bat)
  {
    mBat = _Bat;
  }

  protected Bat mBat;
}
在击球课上

public class Bat : Form1
{
  public Bat() :  base(this)
  {

  }
}

这里没有足够的信息。您可以发布该类的所有构造函数及其基类的所有构造函数的代码吗?(一旦你点击了BCL类的基类,你就可以停止)你发布的代码(减去引用
游戏区的行)对我来说效果很好,所以问题一定出在你没有发布的部分之一。我已经按照这种情况下的要求为Form1类添加了代码,然后如何访问
表单1
中的
游戏区
对象?我已经将其作为公共对象,但是当我从
Bat
类中删除
:Form1
时,我无法再访问该变量。@Saladin:您需要通过
Bat
类中的
Form1
的实例访问
游戏区
对象。例如:
myForm1.playArea
@Saladin如果蝙蝠扩展了Form1,那么创建的任何蝙蝠都会看到自己的playArea,而不是它所在的表单中的playArea
public class Bat : Form1
{
  public Bat() :  base(this)
  {

  }
}