4

私はC#でこのビルダーを持っています(当然、例は単純化されています):

class BusBuilder
{
    Wheels mWheels = DefaultWheels;
    int mRoute = 0;

    public BusBuilder WithWheels(Wheels aWheels)
    {
        mWheels = aWheels;
        return this;
    }

    public BusBuilder WithRoute(int aRoute)
    {
        mRoute = aRoute;
        return this;
    }

    public Bus Build()
    {
        return new Bus { Wheels = mWheels, Route = mRoute };
    }
}

次のように使用されます。

Bus bus = 
    new BusBuilder()
    .WithWheels(someWheels)
    .WithRoute(50)
    .Build()

ここで、一部のメソッドのみを含むスーパークラスを抽出したいと考えています。

class VehicleBuilder
{
    Wheels mWheels = DefaultWheels;

    public VehicleBuilder WithWheels(Wheels aWheels)
    {
        mWheels = aWheels;
        return this;
    }
}

class BusBuilder : VehicleBuilder
{
    ...
}

問題は、今私が書くことができないことです

Bus bus = 
    new BusBuilder()
    .WithWheels(someWheels)
    .WithRoute(50)
    .Build()

ではなく aをWithWheels返すため、メソッドを定義しません。VehicleBuilderBusBuilderWithRoute

これをどのように設計しますか?

4

1 に答える 1

14

ビルダー パターンは、継承に関しては少し面倒です。次のようなことができます。

class VehicleBuilder<T> where T : VehicleBuilder<T>
{
    private T @this;

    protected VehicleBuilder()
    {
        // Or pass it in as a constructor parameter
        @this = (T) this;
    }

    public T WithWheels(...)
    {
        return @this;
    }
}

それで:

class BusBuilder : VehicleBuilder<BusBuilder>
{
    ...
}

その時点で、WithWheelsメソッドは引き続き a を返すBusBuilderので、引き続き を呼び出すことができますWithRoute

また、派生クラス ビルダーごとに新しいBuildメソッドが必要になります。

于 2012-12-19T10:16:55.090 に答える