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

C#中的通用继承类型限制,第1张

概述我有一个不太优雅的解决方案,我需要的,但我正在寻找一个优雅的解决方案来取代它. 以下代码无法编译,但代表了我想要做的事情: interface IWebService{}abstract class BaseClient<T>{}class SpecializedClient : BaseClient<IWebService>{}class ClientHelper<T> 我有一个不太优雅的解决方案,我需要的,但我正在寻找一个优雅的解决方案来取代它.

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

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

以上是内存溢出为你收集整理的C#中的通用继承类型限制全部内容,希望文章能够帮你解决C#中的通用继承类型限制所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1243882.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存