2009-02-23 89 views
2

我有一个通用的类型参数的接口:声明继承泛型复杂类型约束

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

我也有具有需要是接口类型的类型参数的类:

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

这个声明有一个问题。我不能放置“IDriveable”,因为它没有类型参数,并且与IDriveable的类型签名不匹配。但我也不想把IDriveable <U>或者,因为然后VehicleFactory必须知道什么种类 IDriveable它越来越。我希望VehicleFactory能够接受任何类型的IDriveable。

提出的解决方案同事必须是使用:

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

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

问号应该怎么走?

+0

为什么必须IDriveable 是一个参数?你不能在课堂内使用IDriveable ,只能得到AllWheelDrive参数吗? – configurator 2009-02-23 08:57:16

回答

0

这是否适合您?

这将让工厂知道什么类型的driveables是。

+0

它看起来像你比我快一分钟,完全相同的答案;-) – Mouk 2009-02-23 06:20:21

+0

这似乎不是最佳。我不需要写“VehicleFactory ,AllWheelDrive>”吗?这是多余的。 – sassafrass 2009-02-23 06:22:04

0

您可以使用2种类型的泛型定义VehicleFactory,并将其中的一个与接口对齐。这样的事:

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

我希望这不是你与可驱动的东西。我猜U是一个特定的类型。 Like String等

3

什么是VehicleFactory去与T?它是否真的需要约束才能工作,还是仅仅为了开发人员的完整性检查?

这一轮常用的方法是申报非通用接口(IDriveable),然后进行仿制一个扩展是:

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

如果希望厂家能够做的事情与T,您可以将IDriveable<T>中不关心T的任何接口成员放入非通用IDriveable