繁体   English   中英

构建器之间的继承 - 如何处理类型?

[英]Inheritance between builders - how to deal with types?

我在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()

因为WithWheels返回一个VehicleBuilder而不是BusBuilder ,因此没有定义WithRoute方法。

你会怎么设计这个?

在继承方面,构建器模式有点痛苦。 你可以这样做:

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方法仍将返回BusBuilder因此您仍然可以调用WithRoute

您还需要在每个派生类构建器中使用新的Build方法,请注意......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM