gpt4 book ai didi

c# - 具有相同泛型方法的抽象类和接口(interface)

转载 作者:行者123 更新时间:2023-11-30 14:02:20 27 4
gpt4 key购买 nike

我正在编写两个将在我的许多项目中使用的 API。有些项目我使用其中一种 API,有些则使用另一种,但我的大多数项目都会同时使用这两种 API。我试图将它们设计得好像它们是完全独立的,但我在一件事上苦苦挣扎。

namespace FirstApi {
public abstract class MyBaseClass {
//constructor, some methods and properties

public IEnumerable<T> Search<T>() where T : MyBaseClass, new() {
//search logic here. must use generics as I create new instances of T here
}
}
}


namespace SecondApi {
public interface IMyInterface {
//some property and method signatures

IEnumerable<T> Search<T>() where T : IMyInterface, new();
}
}

namespace MyProject {
public class MyDerivedClass : MyBaseClass, IMyInterface {

}
}

两个 API 都需要这种搜索方法。第二个 API 在调用 IMyInterface.Search<T>() 的其他类中具有一些功能。 ,我想要那些继承 MyBaseClass 的类使用Search<T> MyBaseClass 中定义的函数.

编译错误: 方法“MyBaseClass.Search()”的类型参数“T”的约束必须与接口(interface)方法“IMyInterface.Search”的类型参数“T”的约束匹配()'。考虑改用显式接口(interface)实现。

注意:调用 Search 时,T 将始终是已继承的抽象类或接口(interface)的派生类。这是我能找到的在 C# 2.0 ( C# abstract class return derived type enumerator ) 中实现此目的的唯一方法,它只会导致更多问题!

有没有一种类型安全的方法可以实现这一点,而无需使用对象和转换?

解决方案:

根据 Andras Zoltan 接受的答案,我在我的项目中创建了这个类,并且必须为使用这两个 API 的每个项目重新创建这个类。

public abstract class ApiAdapter<TAdapter> : MyBaseClass, IMyInterface where TAdapter: MyBaseClass, IJsonObject, new()
{
IEnumerable<T> IJsonObject.Search<T>()
{
foreach (TAdapter row in base.Search<TAdapter>())
yield return (T)(IMyInterface)row;
}
}

然后我就这样继承了这个类。

public class Client : ApiAdapter<Client> {
//everything else can go here
}

最佳答案

您可以显式实现接口(interface)搜索方法,例如

    public class MyDerivedClass : BasicTestApp.FirstApi.MyBaseClass, BasicTestApp.SecondApi.IMyInterface
{
IEnumerable<T> SecondApi.IMyInterface.Search<T>()
{
// do implementation
}
}

但是,我认为您要求的是 MyBaseClass当处理您的对象的代码部分为 IMyInterface 时要调用的搜索方法调用 Search<T>方法。我看不到路,因为你有两个 T具有无法关联的不同约束的类型。如果你做了where T : BasicTestApp.FirstApi.MyBaseClass, IMyInterface, new();在 Search 方法的两个定义中,那么您不会有问题,但这会将您的两个 API 联系在一起

这是您显式实现的接口(interface)方法的可能实现。它不会避免类型转换,但至少保持整洁。

        IEnumerable<T> SecondApi.IMyInterface.Search<T>()
{
var results = base.Search<MyDerivedClass>();

return results.Cast<T>();
}

关于c# - 具有相同泛型方法的抽象类和接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6121896/

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