[英]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.