声明具有复杂类型约束的继承泛型

时间:2009-02-23 06:10:58

标签: c#

我有一个带有单个泛型类型参数的接口:

public interface IDriveable<T> where T : ITransmission { ... }

我还有一个类,其类型参数必须是该接口类型:

public class VehicleFactory<T> where T : /* ??? */

此声明存在问题。我不能把“IDriveable”,因为它没有类型参数,与IDriveable的类型签名不匹配。但我也不想把IDriveable&lt; U&gt;或者,因为那时VehicleFactory必须知道它正在获得的IDriveable kind 。我希望VehicleFactory接受任何类型的IDriveable。

同事所建议的解决方案是使用:

public class VehicleFactory<T, U> where T : IDriveable<U>

但我不喜欢这个,因为它是多余的。我必须说“U”型两次:

var factory = new VehicleFactory<IDriveable<AllWheelDrive>, AllWheelDrive>();

问号应该怎样?

4 个答案:

答案 0 :(得分:3)

什么是使用T 的VehicleFactory?它是否真的需要约束才能工作,或者仅仅是为了开发人员的健全性检查?

一种常见的方法是声明一个非通用接口(IDriveable),然后使你的通用接口扩展为:

public interface IDriveable {}
public interface IDriveable<T> : IDriveable {}
public class VehicleFactory<T> where T : IDriveable

如果 希望工厂能够使用T执行操作,则可以放置IDriveable<T>中不关心T的任何接口成员进入非通用IDriveable

答案 1 :(得分:0)

这对你有用吗?

public class VehicleFactory<T, U> where T : IDriveable<U>

这将让工厂知道驱动器的类型。

答案 2 :(得分:0)

您可以使用2种类型的泛型定义VehicleFactory,并将其中一种设置为接口。类似的东西:

public class VehicleFactory<T1,T2> where T1 : IDriveabel<T2>

我希望这不是你和Idriveable的关系。我猜U是特定类型。像String等

答案 3 :(得分:0)

您可以缩短经常使用的案例,如下所示:

interface IDriveableAllWheel : IDriveable<AllWheelDrive>
{}

var factory = new VehicleFactory<IDriveableAllWheel, AllWheelDrive>();

甚至

class AllWheelFactory : VehicleFactory<IDriveableAllWheel, AllWheelDrive>
{}

还可以在Calling Generic Property In Generic Class From Interface Implemented By Generic Class中查看kvb的答案,了解可能的解决方法。