член общественного класса виден потомкам - PullRequest
0 голосов
/ 02 июня 2009

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

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 ]

2 голосов
/ 02 июня 2009

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

2 голосов
/ 02 июня 2009

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

...