C# 创建类的实例时出现问题
我在Visual Studio 2010中创建了以下类: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,
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)
{
}
}