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

标签 c# oop design-patterns builder

我在 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/

相关文章:

c# - 属性初始化和 'this'

c# - 异步功能未完成,但我没有收到任何错误消息

c# - 从C#中的一系列数字中获取最小值和最大值而不进行排序

c# - 如何使用 slider 纠正高音量下降

objective-c - 设计一个接口(interface)而不是 Objective-C 中的实现

design-patterns - 当需要日志记录时,您会考虑哪种设计模式?

javascript - 如何收集多个回调以在任务完成后调用

c# - 如何从 url 读取 csv 文件?

java - 如何学习用 Java 设计应用程序

c++ - 删除字符指针得到堆错误