Член публичного класса виден потомкам
Я получил большую тягу от модели строителя как член открытого класса другого класса:
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 ответа
Есть много способов снять шкуру с кошки, но путь наименьшего сопротивления здесь будет делать конструкторы ваших различных типов деталей публичными или внутренними.
Вы не можете сделать это, за исключением того, что вы помещаете их в свою сборку и используете внутренний спецификатор доступа.