我有一个不太优雅的解决方案,我需要的,但我正在寻找一个优雅的解决方案来取代它.
以下代码无法编译,但代表了我想要做的事情:
- interface IWebService
- {
- }
- abstract class BaseClient<T>
- {
- }
- class SpecializedClient : BaseClient<IWebService>
- {
- }
- class ClientHelper<T> where T : BaseClient<*>
- {
- }
其中ClientHelper中的T< T>无论传入的模板类型如何,都是扩展BaseClient的任何类.
我找到的不优雅的解决方案是:
- class ClientHelper<T,U> where T : BaseClient<U> {}
这变得不优雅的原因是我的项目最终得到了类似于以下的类:
- class MyClass<A,B,C,D,E,F,G> where A : MyBaseClass<B,G>
一直到一个类型的基类.这只是具有泛型类的复杂继承树的成本,还是有更简单的方法来保留模板化类型的类型限制?
解决方法
如果BaseClient的公共接口以任何方式公开它的泛型类型参数,那么你的“不优雅”解决方案是正确的.
所以假设BaseClient不像你定义的那样:
- abstract class BaseClient<T>
- {
- //Something about T here
- }
然后T是BaseClient的公共接口契约的一部分,因此是ClientHelper的公共接口契约的一部分(同样,假设BaseClient< U>通过ClientHelper的接口公开).
另一方面,让我们假设它实际上就像你的例子所说:
- abstract class BaseClient<T>
- {
- //Nothing about T here
- }
在这种情况下,你可以这样做:
- interface IBaseClient
- {
- //Nothing about T here
- }
- abstract class BaseClient<T> : IBaseClient
- {
- // Whatever you like here
- }
和ClientHelper成为:
- class ClientHelper<T> where T : IBaseClient
- {
- }