我目前有一个继承结构,其中方法的返回类型保留为开放泛型,以便每个类都可以从另一个结构的相应级别返回一个对象。例如,假设我们有一个 VehicleFactory,其中 TVehicle:Vehicle 可以 ProduceVehicle TVehicle。我也有 CarFactory:VehicleFactory 其中 TVehicle:Car。
Car 继承自 Vehicle,因此所有这些都是有效的,并且让我知道我的 CarFactory 必须生产 Cars,而我的 Vehicle 工厂可以生产任何类型的车辆。我遇到的问题是,我需要一种方法在 Ford 运行时将 VehicleFactory 实例化为 CarFactory,而在 Wave Runner 运行时将其实例化为 BoatFactory。
我想我可以通过创建一个与 VehicleFactory 的功能相匹配的接口并编写一个返回 IVehicleFactory 的 MakeFactory 方法来做到这一点(它将非通用返回车辆)。由于 CarFactory 返回作为车辆的汽车,它实现了接口,并且在世界上一切都应该是正确的。出乎意料的问题是,尽管 TVehicle 必须是 Vehicle,但 VehicleFactory 无法满足作为 TVehicle 是 Vehicle 而关闭的接口。
有谁知道这是为什么,或者是否有其他方法可以解决这个限制?如果无法直接绕过此限制,是否有任何替代方法可以让一组共享功能确保它始终被实例化为两组或更多组更具体的类之一。(其中 Vehicle 是共享层,Car 和 Boat 是上下文特定层。)
class Vehicle
{
}
class Car : Vehicle
{
}
interface IVehicleFactory
{
Vehicle ProduceVehicle();
}
class VehicleFactory<TVehicle> : IVehicleFactory
where TVehicle:Vehicle
{
public virtual TVehicle ProduceVehicle()
{
}
}
class CarFactory<TVehicle> : VehicleFactory<TVehicle>
where TVehicle : Car
{
public override TVehicle ProduceVehicle()
{
}
}
以及使用它的代码
static IVehicleFactory CreateVehicleFactory()
{
if(somecondition)
{
Return new CarFactory<Car>();
}
else
{
Return new BoatFactory<Boat>();
}
}
添加更多细节以澄清问题。
术语工厂的使用并不意味着工厂模式。它实际上是一个检索“车辆”的存储库。车辆类型是具有公共共享基本代码的库的应用程序特定版本。每个应用程序 Car 和 Boat 的存储库对于相同的检索可能具有不同的逻辑,并且可能依赖于其对象的 Car 或 Boat 变体中的字段。我需要一种方法来构建一个工厂,它可以查看我所在的应用程序的上下文并返回适当的存储库(BoatFactory 或 CarFactory),以便车辆级别的共享代码将正确使用任何应用程序特定的覆盖功能。