子类实例化|Stackoverlowexception



我得到了很多代码,但问题本身对我来说非常清楚,所以我发布了一个例子:

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个实例=>ExcelTableExcelOutput。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字段,将其删除。

相关内容

  • 没有找到相关文章

最新更新