Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 构建器之间的继承-如何处理类型?_C#_Oop_Design Patterns_Builder - Fatal编程技术网

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

C# 构建器之间的继承-如何处理类型?,c#,oop,design-patterns,builder,C#,Oop,Design Patterns,Builder,我用C#编写了这个生成器(当然,这个示例是简化的): 它是这样使用的: Bus bus = new BusBuilder() .WithWheels(someWheels) .WithRoute(50) .Build() class VehicleBuilder<T> where T : VehicleBuilder<T> { private T @this; protected VehicleBuilder()

我用C#编写了这个生成器(当然,这个示例是简化的):

它是这样使用的:

Bus bus = 
    new BusBuilder()
    .WithWheels(someWheels)
    .WithRoute(50)
    .Build()
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 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
方法


您将如何设计它?

在继承方面,构建器模式有点麻烦。您可以这样做:

Bus bus = 
    new BusBuilder()
    .WithWheels(someWheels)
    .WithRoute(50)
    .Build()
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 VehicleBuilder,其中T:VehicleBuilder
{
私人T@this;
受保护车辆制造商()
{
//或者将其作为构造函数参数传入
@this=(T)this;
}
带轮子的公共T(…)
{
返回@this;
}
}
然后:

类总线生成器:车辆生成器
{
...
}
此时,您的
WithWheels
方法仍将返回一个
BusBuilder
,因此您仍然可以调用
WithRoute

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