我正在编写两个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
的类使用在 MyBaseClass
中定义的 Search<T>
函数。编译错误:方法 'MyBaseClass.Search()' 的类型参数 'T' 的约束必须与接口方法 'IMyInterface.Search()' 的类型参数 'T' 的约束相匹配。请考虑使用显式接口实现。
注意:当调用 Search 时,T 将始终是继承了抽象类或接口的派生类。这是我在 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
}
Search
到底搜索什么? - JodrellMyBaseClass
,以帮助其他人解决类似的问题。 - Connell