gpt4 book ai didi

c# - C# 中的泛型继承类型限制

转载 作者:太空狗 更新时间:2023-10-29 20:28:24 25 4
gpt4 key购买 nike

我有一个不优雅的解决方案来满足我的需要,但我正在寻找一个优雅的解决方案来替换它。

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

interface IWebService
{
}

abstract class BaseClient<T>
{
}

class SpecializedClient : BaseClient<IWebService>
{
}

class ClientHelper<T> where T : BaseClient<*>
{
}

哪里TClientHelper<T>是任何扩展 BaseClient 的类不管传入的模板类型如何。

我发现的不优雅的解决方案是:

class ClientHelper<T, U> where T : BaseClient<U> {}

这变得不优雅的原因是我的项目以类似于以下的类结束:

class MyClass<A, B, C, D, E, F, G> where A  : MyBaseClass<B, C, D, E, F, G>

一直到采用单一类型的基类。这仅仅是拥有泛型类的复杂继承树的成本,还是有一种更简单的方法可以做到这一点,同时保留对模板化类型的类型限制?

最佳答案

如果 BaseClient 的公共(public)接口(interface)以任何方式公开它的通用类型参数,那么您的“不雅”解决方案就是正确的。

所以假设BaseClient不是你定义的:

abstract class BaseClient<T>
{
//Something about T here
}

那么T是BaseClient的公共(public)接口(interface)合约的一部分| ,因此是 ClientHelper 的公共(public)接口(interface)合约的一部分 | (同样,假设 BaseClient<U> 通过 ClientHelper 的接口(interface)公开)。

另一方面,让我们假设它实际上如您的示例所示:

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# 中的泛型继承类型限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10004560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com