子类实例化|Stackoverlowexception
本文关键字:Stackoverlowexception 实例化 子类 | 更新日期: 2023-09-27 18:26:20
我得到了很多代码,但问题本身对我来说非常清楚,所以我发布了一个例子:
public class ExcelTable
{
public ExcelTable() // CONSTRUCTOR
{
// create new excel-application and so on..
}
public ExcelOutput Output = new ExcelOutput(); // Stackoverflowexception
private xlWorkbook; // I need these to inherit into ExcelOutput
private xlWorksheet; // '' ''
// ... // '' ''
public class ExcelOutput : ExcelTable
{
public void SaveAs()
{
// self explaining
}
public void Show()
{
// self explaining
}
public void Print()
//....
}
}
目标:编辑
为了给excel创建一个清晰的帮助类,我希望创建一个负责可能输出的子类。详细地说,我试图避免从外部创建2个实例=>ExcelTable
和ExcelOutput
。Im更希望创建一个单独的实例ExcelTable
,并使用该实例访问子类。因为我需要继承,所以我不能将类设置为静态。
问题:
我得到了Stackoverflowexception
。我试着调试我的代码。在ExcelOutput
的实例化时,代码在这一行循环。意味着:即使我尝试单步执行(F11),执行也会停留在ExcelOutput的初始化上,这会导致我的工具出现StackoverlowException。
我尝试过的:
public ExcelTable() // CONSTRUCTOR
{
// create new excel-application and so on..
Output = Output ?? new ExcelOutput();
}
public ExcelOutput Output;
在这种情况下,ExcelTable
被一次又一次地创建。整个上流社会永远都会被讨好。
有人能向我解释一下为什么这一行永远循环吗?看起来ExcelOutput
的实例化正在创建ExcelTable
的新实例。
我知道这更多的是关于知识,因为我是继承和子类的新手。谷歌在这方面帮不了什么忙。根据类、子类和继承,有太多的东西。
感谢您的每一次帮助。非常感谢!
如前所述,问题是ExcelOutput
继承自ExcelTable
,从而继承了用ExcelOutput
的新实例初始化的Output
字段,该实例再次具有Output
字段。。。
这种递归组合将填充堆栈,从而导致StackOverflowException
异常。
这里有一个快速解决方案,可以让你继续:
public class ExcelTable
{
public ExcelTable()
{
// create new excel-application and so on..
//initialize xlWorkbook and xlWorksheet
Output = new ExcelOutput(xlWorkbook, xlWorksheet);
}
public ExcelOutput Output;
private Workbook xlWorkbook;
private Worksheet xlWorksheet;
public class ExcelOutput
{
private Workbook xlWorkbook;
private Worksheet xlWorksheet;
public ExcelOutput(Workbook xl_workbook, Worksheet xl_worksheet)
{
xlWorkbook = xl_workbook;
xlWorksheet = xl_worksheet;
}
public void SaveAs()
{
// self explaining
}
public void Show()
{
// self explaining
}
public void Print()
{
}
//....
}
}
ExcelOutput
不再继承自ExcelTable
,但它在构造时接收到所需的依赖关系。
我的解决方案决不是一个好的设计。我只是给你一个快速的解决办法。一个好的设计需要对大局的理解。
当您实例化ExcelTable或ExcelOutput时,构造函数将初始化Output字段,换句话说,它将实例化另一个ExcelOutput,然后一次又一次地实例化,直到堆栈空间用完,然后您收到这个StackOverflowException,您可能不需要Output字段,将其删除。