简体   繁体   English

构建器模式保护构造函数

[英]Builder pattern protected constructor

Going through this exercise/design-pattern for Builder pattern:通过这个 Builder 模式的练习/设计模式:

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

Making the HtmlElement constructor "protected" breaks everything, making it internal seems to work and at the same time limit access a bit使 HtmlElement 构造函数“受保护”破坏了一切,使其内部似乎可以工作,同时限制访问

Is there a way to make protected HtmlElement work ?有没有办法让受保护的 HtmlElement 工作?

source:来源:

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();   
    
}

练习生成器模式

All types and type members have an accessibility level.所有类型和类型成员都具有可访问性级别。 The accessibility level controls whether they can be used from other code in your assembly or other assemblies.可访问性级别控制是否可以从程序集中的其他代码或其他程序集中使用它们。 Use the following access modifiers to specify the accessibility of a type or member when you declare it:在声明类型或成员时,使用以下访问修饰符指定类型或成员的可访问性:

public: The type or member can be accessed by any other code in the same assembly or another assembly that references it. public:同一程序集或引用它的另一个程序集中的任何其他代码都可以访问该类型或成员。

private: The type or member can be accessed only by code in the same class or struct. private:类型或成员只能被同一类或结构中的代码访问。

protected: The type or member can be accessed only by code in the same class, or in a class that is derived from that class. protected:类型或成员只能由同一类中的代码或从该类派生的类中的代码访问。

internal: The type or member can be accessed by any code in the same assembly, but not from another assembly. internal:类型或成员可以被同一程序集中的任何代码访问,但不能从另一个程序集中访问。

protected internal: The type or member can be accessed by any code in the assembly in which it's declared, or from within a derived class in another assembly. protected internal:类型或成员可以被声明它的程序集中的任何代码访问,或者从另一个程序集中的派生类中访问。

private protected: The type or member can be accessed only within its declaring assembly, by code in the same class or in a type that is derived from that class.私有保护:该类型或成员只能在其声明程序集中、同一类中的代码或从该类派生的类型中访问。

you cannot call protected constructor from a different class that does not derive from HtmlElement.您不能从不是从 HtmlElement 派生的不同类中调用受保护的构造函数。 Is there any use for creating that access modifier?创建该访问修饰符有什么用吗?

if so, what you are looking for is probably internal \\ private protected, depend on the useage如果是这样,您正在寻找的可能是内部\\私有保护,取决于使用情况

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM