2015-12-09 2 views
0

Я получил много кода, но сама проблема очень ясно для меня, так что я отправляю пример:Создание подкласса | StackOverflowException

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

Цель: EDITED
В целях четкого helping- класс для моего желания заключается в создании подкласса, который заботится о возможном выходе. В деталях я пытаюсь предотвратить создание двух экземпляров извне =>ExcelTable и ExcelOutput. Im скорее хотел бы создать один экземпляр ExcelTable и получить доступ к подклассу с этим экземпляром. Поскольку мне нужно наследование, я не могу установить класс в static.

Проблема:
Im получение 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.


Я знаю, что это больше о знании, так как я новичок в случае наследования и подклассов. Google не был большой помощью здесь. Там слишком много материала в соответствии с классами, подклассами и наследованием.

Всякая помощь приветствуется. Большое спасибо!

+3

'ExcelOutput' наследует от' ExcelTable', поэтому он наследует переменную 'Output'. –

+0

@YacoubMassad О да, истинная вещь, о которой я не думал. Но это уже вызывает мою проблему? – C4u

+0

@ C4ud3x, да, вот что вызывает проблему. – EduardoS

ответ

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, но он получает необходимые зависимости от конструкции.

Мое решение ни в коем случае не является хорошим дизайном. Я просто даю вам быстрое решение.Хороший дизайн потребует понимания большей картины.

1

Когда вы создаете экземпляр ExcelTable или ExcelOutput, конструктор инициализирует поле «Выход», другими словами, он будет создавать экземпляр другого экземпляра ExcelOutput, а затем снова и снова, пока вы не закончите пространство стека, тогда вы получите это исключение StackOverflowException, вы, вероятно, не требуется поле «Выход», удалите его.

+0

Но когда я удаляю поле 'Output', я не могу получить доступ к' ExcelOutput' извне, не создавая там новый экземпляр !? – C4u

+0

@ C4ud3x, если он должен быть одноточечным (один экземпляр во всем приложении), вы можете изменить это поле, чтобы добавить к нему «статический», тогда можно будет получить к нему доступ через ExcelTable.Output, если многие экземпляры необходимы, просто создайте экземпляр нового ExcelTable.ExcelOutput() или переместите класс ExcelOutput вне класса ExcelTable. – EduardoS

+0

Да, еще один момент, о котором я уже думал. Но когда я устанавливаю «ExcelOutput»-Class в static, я не могу использовать наследование, не могу ли я? Без наследования моих переменных мне пришлось бы передавать мои «excelWorkbook», «excelWorksheet» и т. Д. Для всех функций. Было бы беспорядок .... – C4u

Смежные вопросы