gpt4 book ai didi

c# - builder 之间的继承——如何处理类型?

转载 作者:太空狗 更新时间:2023-10-30 00:08:01 25 4
gpt4 key购买 nike

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

现在我想提取一个只包含一些方法的父类(super class):

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 方法...

关于c# - builder 之间的继承——如何处理类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13949938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com