繁体   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