假設我有一個名為 的類Node,它表示層次結構中的一個節點。例如,它可能看起來像這樣:
public class Node
{
public readonly string Data { get; set; }
public readonly Node Parent { get; set; }
public readonly List<Node> Children { get; } = new()
public Nome(string Data, Node parent)
{
Data = data;
Parent = parent;
}
}
請注意,該屬性Parent屬于型別Node且不可為空,因此我無法分配null給它。現在假設我想為這個類實作空物件模式,例如創建根節點。
我發現自己處于雞和蛋的境地,因為Node沒有節點就無法創建。
除了使Parent可為空之外還有其他選擇嗎?
uj5u.com熱心網友回復:
如果您只使用一個類,則需要 nulltype,但您可以使用介面作為開始。
public class Node : NodeRoot {
public string Data { get; init; }
public Node? Parent { get; init; }
public List<Node> Children { get; init; } = new();
private Node(string data) {
Data = data;
}
private Node(string data, Node parent) {
Data = data;
Parent = parent;
}
public static Node Factory(string data, Node parent) => new(data, parent);
public static INodeRoot Factory(string data) => new Node(data);
}
public interface INodeRoot {
public string Data { get; }
public List<Node> Children { get; }
}
uj5u.com熱心網友回復:
您可以使用語法將欄位保持為不可為空,但將其強制為空= null!(注意!它告訴編譯器信任您)。我可能會將這種技術與子類和/或靜態實體結合起來用作根父級,并在訪問該空父級欄位(或添加計算欄位isRoot)時防止出現問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/367783.html
