子类实例化 | Stackoverflow异常

Subclass instantiation | Stackoverflowexception

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

public class ExcelTable
{
    public ExcelTable() // CONSTRUCTOR
    {
        // create new excel-application and so on..
    }

    public ExcelOutput Output = new ExcelOutput(); // Whosebugexception

    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()
        //....
    }
}

目标:已编辑
为了明确 helping-class for excel 我的愿望是创建一个 subclass 来处理可能的输出。详细地说,我试图避免从外部创建 2 个实例的需要 => ExcelTableExcelOutput。我宁愿创建一个实例 ExcelTable 并使用该实例访问 subclass 。因为我需要继承,所以我无法将 class 设置为静态。

问题:
我收到 Whosebugexception。我尝试调试我的代码。在 ExcelOutput 的实例化中,代码在这一行循环。意思是:即使我尝试单步执行 (F11),执行也会停留在 ExcelOutput 的状态,这会导致我的工具出现 Whosebugexception。

我试过的:

public ExcelTable() // CONSTRUCTOR
{
    // create new excel-application and so on..

    Output = Output ?? new ExcelOutput();
}

public ExcelOutput Output;

在这种情况下,ExcelTable 被一遍又一遍地创建。整个鞋面 class 将永远消失。

谁能向我解释为什么这一行会永远循环?看起来 ExcelOutput 的实例正在创建 ExcelTable.

的新实例

我知道这更多是关于知识的,因为我是继承和子classes 的新手。 Google 在这里帮不了什么大忙。根据 classes、subclasses 和继承,那里的东西太多了。

感谢您的帮助。非常感谢!

当您实例化 ExcelTable 或 ExcelOutput 时,构造函数将初始化 Output 字段,换句话说,它将实例化另一个 ExcelOutput,然后一次又一次,直到您 运行 出栈 space ,然后你收到这个 WhosebugException,你可能不需要 Output 字段,删除它。

如前所述,问题是 ExcelOutput 继承自 ExcelTable,因此继承了 Output 字段,该字段用 ExcelOutput 的新实例初始化,再次有一个 Output 字段 ...

此递归组合将填充堆栈,从而导致 WhosebugException 异常。

这里有一个快速解决方法,可以帮助您继续:

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,但它在构造时接收所需的依赖项。

我的解决方案绝不是一个好的设计。我只是给你一个快速修复。好的设计需要了解大局。