我收到了很多代码,但问题本身对我来说非常清楚,所以我发布了一个例子:
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的目的,我希望创建一个子类来处理可能的输出。详细地说,我试图阻止从outside =>创建2个实例的需要。 ExcelTable
和ExcelOutput
。我宁愿创建单个实例ExcelTable
并使用此实例访问子类。因为我需要继承,所以我不能将类设置为静态。
问题:
我得到了Stackoverflowexception
。我试着调试我的代码。在ExcelOutput
的实例化时,代码在这一行循环。意思是:即使我尝试单步(F11)它,执行仍然在ExcelOutput的实例中,这导致我的工具进入Stackoverflowexception。
我尝试了什么:
public ExcelTable() // CONSTRUCTOR
{
// create new excel-application and so on..
Output = Output ?? new ExcelOutput();
}
public ExcelOutput Output;
在这种情况下,ExcelTable
一次又一次地被创建。这整个上层阶级永远都会得到实例化。
所以有人可以向我解释为什么这一行会永远循环?看起来ExcelOutput
的实例化正在创建ExcelTable
的新实例。
我知道这更多是关于知识,因为我是继承和子类的新手。谷歌在这里不是一个很大的帮助。根据类,子类和继承,有太多的东西。
感谢每一位帮助。非常感谢!
答案 0 :(得分:1)
当你实例化ExcelTable或ExcelOutput时,构造函数将初始化Output字段,换句话说,它将实例化另一个ExcelOutput,然后一次又一次,直到你的堆栈空间不足,然后你收到这个StackOverflowException,你可能没有& #39; t需要输出字段,将其删除。
答案 1 :(得分:1)
如前所述,问题是ExcelOutput
继承自ExcelTable
,因此继承了Output
字段,该字段使用ExcelOutput
的新实例进行初始化,该实例再次具有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
,但它在构造时会收到所需的依赖项。
我的解决方案绝不是一个好的设计。我只是给你一个快速解决方案。一个好的设计需要了解更大的图景。