簡體   English   中英

構建器模式保護構造函數

[英]Builder pattern protected constructor

通過這個 Builder 模式的練習/設計模式:

https://github.com/Apress/design-patterns-in-.net-core-3/blob/master/Creational/Builder/Builder.cs

使 HtmlElement 構造函數“受保護”破壞了一切,使其內部似乎可以工作,同時限制訪問

有沒有辦法讓受保護的 HtmlElement 工作?

來源:

void Main()
{
    var builder = HtmlElement.Create("div")
        .AddChild("li", "hello")
        .AddChild("li", "world")
        ;
    builder.ToString().Dump();
}

public class HtmlElement
{
    internal string Name { get; set; }
    internal string Text { get; set; }
    internal List<HtmlElement> Elements = new();
    
    internal HtmlElement() { }
    internal HtmlElement(string name, string text)
    {
        this.Name = name;
        this.Text = text;
    }
    
    public override string ToString()
    {
        var stringBuilder = new System.Text.StringBuilder();
        stringBuilder
            .Append($"<{Name}>")
            .Append($"{Text}");
            
        foreach (var elem in Elements)
        {
            stringBuilder
                .Append($"<{elem.Name}>")
                .Append($"{elem.Text}")
                //.Append($"{elem.Elements.ToString()}")
                .Append($"</{elem.Name}>");
        }
        stringBuilder.Append($"</{Name}>");
        return stringBuilder.ToString();
    }
    
    public static HtmlBuilder Create(string name) => new HtmlBuilder(name);   

}

public class HtmlBuilder  {
    protected readonly string rootName;
    protected HtmlElement root = new();
    
    internal HtmlBuilder(string rootName) {
        this.rootName = rootName;
        this.root.Name = rootName;
    }
    
    public HtmlBuilder AddChild(string childName, string childText) {
        var elem = new HtmlElement(childName, childText);
        root.Elements.Add(elem);
        return this;
    }
 
    public override string ToString() => root.ToString();   
    
}

練習生成器模式

所有類型和類型成員都具有可訪問性級別。 可訪問性級別控制是否可以從程序集中的其他代碼或其他程序集中使用它們。 在聲明類型或成員時,使用以下訪問修飾符指定類型或成員的可訪問性:

public:同一程序集或引用它的另一個程序集中的任何其他代碼都可以訪問該類型或成員。

private:類型或成員只能被同一類或結構中的代碼訪問。

protected:類型或成員只能由同一類中的代碼或從該類派生的類中的代碼訪問。

internal:類型或成員可以被同一程序集中的任何代碼訪問,但不能從另一個程序集中訪問。

protected internal:類型或成員可以被聲明它的程序集中的任何代碼訪問,或者從另一個程序集中的派生類中訪問。

私有保護:該類型或成員只能在其聲明程序集中、同一類中的代碼或從該類派生的類型中訪問。

您不能從不是從 HtmlElement 派生的不同類中調用受保護的構造函數。 創建該訪問修飾符有什么用嗎?

如果是這樣,您正在尋找的可能是內部\\私有保護,取決於使用情況

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM