【问题标题】:Inheritance between builders - how to deal with types?构建器之间的继承 - 如何处理类型?
【发布时间】:2012-12-06 15:51:32
【问题描述】:

我在 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 方法。

你会如何设计这个?

【问题讨论】:

    标签: c# oop design-patterns builder


    【解决方案1】:

    构建器模式在继承方面有点让人头疼。你可以这样做:

    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 方法,请注意...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多