我有一个带有单个泛型类型参数的接口:
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>();
问号应该怎样?
答案 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的答案,了解可能的解决方法。