Член публичного класса виден потомкам

Я получил большую тягу от модели строителя как член открытого класса другого класса:

public class Part
{
    public class Builder
    {
        public string Name { get; set; }
        public int Type { get; set; }

        public Part Build()
        {
            return new Part(Name, Type);
        }
    }

    protected Part(string name, int type)
    {
        ...
    }
}

Обратите внимание, защищенный конструктор - мне нравится, как я должен использовать конструктор, чтобы получить деталь. Звонки в

Part p = new Part.Builder() { Name = "one", Type = 1 }.Build();

отлично работает То, что я хотел бы сделать, это использовать этот конструктор для обслуживания особого вида деталей, основанных на типе (например):

public class SpecialPart : Part
{
    protected SpecialPart(string name, int type) : base(name, type) { }
}

И небольшое изменение для строителя:

public Part Build()
{
    if (Type == _some_number_)
        return new SpecialPart(Name, Type);
    return new Part(Name, Type);
}

Но это не работает - Part.Builder не может видеть защищенный конструктор SpecialPart. Как я могу заставить Builder работать с потомками Части и получить ту же семантику, которая обязательна для строителя?

2 ответа

Решение

Есть много способов снять шкуру с кошки, но путь наименьшего сопротивления здесь будет делать конструкторы ваших различных типов деталей публичными или внутренними.

Вы не можете сделать это, за исключением того, что вы помещаете их в свою сборку и используете внутренний спецификатор доступа.

Другие вопросы по тегам