私は現在、ロアの作成を支援するプログラムを作成しています。すべての Book オブジェクトは親になり、子を持つことができます。これは、すべての子供が子供などを無限に持つことができることを意味します。再帰を使用してこれを説明できる ToString() メソッドに取り組んでいましたが、StackOverflowException が発生し続けます。
それが何を意味するかはわかっていますが、それをどのように修正するかについては疑問です。私は C# にはかなり慣れていませんが、Java の経験はかなりあります。そのため、私が見逃したトリックや何かを知っている場合はお知らせください。
私の質問は次のとおりです。StackOverflow 例外を回避するにはどうすればよいですか? 問題は GetAllChildren() にあります
編集:
テストを実行すると、次のようになります。
Name: a
Children:
b
c
d
e
@lcからのコードで。次の出力が得られます。
Name: a
Children: No Children b
c
e
b
c
e
b
c
e
クラスは次のとおりです。
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();
}
}