Ich schreibe gerade ein Programm, um zu helfen, Lore zu schreiben. Jedes Buchobjekt kann ein Elternteil sein und Kinder haben. Das bedeutet, dass jedes Kind Kinder usw. ins Unendliche haben kann. Ich arbeitete an einer ToString() -Methode, die dies mithilfe der Rekursion berücksichtigen könnte, aber ich erhalte immer eine StackOverflowException.StackOverflowException verursacht durch Rekursion
Ich weiß, was es bedeutet, aber ich habe Zweifel, wie ich es beheben kann. Ich bin ziemlich neu in C#, habe aber ziemlich viel Java-Erfahrung. Wenn Sie also einen Trick oder etwas wissen, was ich verpasst habe, lassen Sie es mich wissen!
Also meine Frage ist: Wie vermeide ich eine StackOverflow-Ausnahme? Das Problem ist in GetAllChildren()
EDIT:
Nach einem Test läuft, sollte ich so etwas wie dieses:
Name: a
Children:
b
c
d
e
Mit dem Code von @lc. Ich erhalte die folgende Ausgabe:
Name: a
Children: No Children b
c
e
b
c
e
b
c
e
Hier ist die Klasse:
class Book
{
private String name;
private Book[] children;
private StringBuilder text;
private Boolean isParent;
public Book(String name, Book[] children, StringBuilder text, Boolean isParent)
{
this.name = name;
this.children = children;
this.text = text;
this.isParent = isParent;
}
/**
* Most likely all possible Constructors
* */
public Book(String name, Book[] children) : this(name, children, new StringBuilder("No Text"), true) { }
public Book(String name, String text) : this(name, new Book[0], new StringBuilder(text), false) { }
public Book(String name, StringBuilder text) : this(name, new Book[0], text, false) { }
public Book(String name) : this(name, new Book[0], new StringBuilder("No Text"), false) { }
public Book(Book[] children, String text) : this("Unnamed Book", children, new StringBuilder(text), true) { }
public Book(Book[] children, StringBuilder text) : this("Unnamed Book", children, text, true) { }
public Book(Book[] children) : this("Unnamed Book", children, new StringBuilder("No Text"), true) { }
public Book(StringBuilder text) : this("Unnamed Book", new Book[0], text, false) { }
public Book() : this("Unnamed Book", new Book[0], new StringBuilder("No Text"), false) { }
public String Name
{
get { return name; }
set { name = value; }
}
public Book[] Children
{
get { return children; }
set { children = value; }
}
/**
* Will Return the StringBuilder Object of this Text
* */
public StringBuilder Text
{
get { return text; }
set { text = value; }
}
public Boolean IsParent
{
get { return isParent; }
set { isParent = value; }
}
private void GetAllChildren(Book book, StringBuilder sb)
{
if (book.isParent)
{
GetAllChildren(book, sb);
}
else
{
sb.Append("\t");
foreach (Book b in children)
{
sb.Append(b.Name + "\n");
}
}
}
public override String ToString()
{
StringBuilder sChildren = new StringBuilder("No Children");
if (children.Length != 0)
{
GetAllChildren(this, sChildren);
}
return "Name: " + name + "\n" +
"Children: " + sChildren.ToString();
}
}
von stackoverflow.com' –
@SiGanteng bei 'fragen Ich machte den Witz bedenkt, aber ich wählte nicht zu; P – OmniOwl
Was das Denken hinter Aufruf' GetAllChildren (Buch, sb) war; 'innerhalb der' isParent' Zweig ?Beachten Sie, dass weder 'book' noch' sb' verändert wurden. –