2009-06-02 2 views
0

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

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 работать с потомками Части и получить семантику must-have-a-builder?

+1

Есть ли причина, по которой Builder - это класс, а не только защищенный метод? – Robert

+0

@Robert: protected = public? –

+0

да, общественность, конечно. Я думал о конструкторе. – Robert

ответ

2

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

2

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

Смежные вопросы