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 を Part の子孫と連携させ、ビルダーに必須の同じセマンティクスを取得するにはどうすればよいですか?

4

2 に答える 2

2

猫の皮を剥ぐには多くの方法がありますが、ここでの抵抗が最も少ない方法は、さまざまなパーツ タイプのコンストラクターをパブリックまたは内部にすることです。

于 2009-06-02T19:14:05.857 に答える
2

それらを独自のアセンブリに入れ、内部アクセス指定子を使用する以外は、それを行うことはできません。

于 2009-06-02T19:14:22.110 に答える