加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#中的通用继承类型限制

发布时间:2020-12-15 07:47:22 所属栏目:百科 来源:网络整理
导读:我有一个不太优雅的解决方案,我需要的,但我正在寻找一个优雅的解决方案来取代它. 以下代码无法编译,但代表了我想要做的事情: interface IWebService{}abstract class BaseClientT{}class SpecializedClient : BaseClientIWebService{}class ClientHelperT w
我有一个不太优雅的解决方案,我需要的,但我正在寻找一个优雅的解决方案来取代它.

以下代码无法编译,但代表了我想要做的事情:

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
{
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读