构建器模式保护构造函数

问题描述

通过这个 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();   
    
}

Exercise Builder pattern

解决方法

所有类型和类型成员都有一个可访问性级别。可访问性级别控制是否可以从程序集中的其他代码或其他程序集中使用它们。在声明类型或成员时,使用以下访问修饰符来指定它的可访问性:

public:该类型或成员可以被同一程序集中的任何其他代码或引用它的另一个程序集中访问。

private:类型或成员只能由同一类或结构中的代码访问。

受保护:类型或成员只能由同一类中的代码或从该类派生的类中的代码访问。

内部:同一程序集中的任何代码都可以访问该类型或成员,但不能从另一个程序集中访问该类型或成员。

受保护的内部:类型或成员可以被声明它的程序集中的任何代码访问,或者从另一个程序集中的派生类中访问。

私有保护:该类型或成员只能在其声明程序集中、同一类中的代码或从该类派生的类型中访问。

不能从不是从 HtmlElement 派生的不同类中调用受保护的构造函数。 创建那个访问修饰符有什么用吗?

如果是这样,您正在寻找的可能是内部\私有保护, 看用途