子类实例化| Stackoverflowexception

时间:2015-12-09 15:22:11

标签: c# oop inheritance stack-overflow subclass

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

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个实例的需要。 ExcelTableExcelOutput。我宁愿创建单个实例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的新实例。

我知道这更多是关于知识,因为我是继承和子类的新手。谷歌在这里不是一个很大的帮助。根据类,子类和继承,有太多的东西。

感谢每一位帮助。非常感谢!

2 个答案:

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

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