我有一个包含类的库。本课程旨在扩展。它将连接到数据库并生成扩展它的类的条目。现在我想返回一个扩展类类型的数组。我怎样才能做到这一点 ?例如:
public this[] search(string search) {
}
我该怎么做?
编辑: 我正在使用泛型,它是一个泛型类。这意味着我没有任何关于扩展我的课程的线索。所以我不能在[] ...
之前添加类名编辑2: 正如已经指出的那样,返回一个这样的数组没有任何意义(我的错误)。所以我想要做的是返回一个扩展类类型的数组。 例如:
public abstract class MappingObject {
public ExtendedClassType[] search (string search) {
}
}
找到解决方案._。对不起,这很简单......
public abstract class MappingObject<T> where T : new() {
public static List<T> search(string search) {
}
}
答案 0 :(得分:4)
我不完全确定您在寻找什么,但根据您提出的问题中的一些线索,您可能希望查看以下内容(称为Curiously Recurring Template Pattern):
public abstract class MyBaseClass<T> : where T : MyBaseClass<T>
{
public abstract T[] Search(string search);
}
public class DerivedClass : MyBaseClass<DerivedClass>
{
public override DerivedClass[] Search(string search)
{
return new DerivedClass[0];
}
}
这是可能的,但我不确定它是否是您正在寻找的东西,我会检查这是否是一个好的设计选择,它感觉有点漏洞。
这个特殊的想法在CSLA.NET这样的框架中使用,以便在从某些基类继承时向自己公开派生类的强引用。这通常是一个“语法糖”的东西,并且避免在从基类中检索它们时只需要使用自己类型的东西。基类本身仍然不应该理解从中派生出什么类型。
Eric Lippert talks about this pattern on his old MS blog。它有陷阱,并暴露出一种可以被滥用的方式。我个人坚持认识到这些陷阱和滥用可能性的方法是足够好的,只要事情经过测试我很乐意使用可能违反准则或原则的事情,如果情况明确(没有足够的额外信息,以了解在这种特殊情况下是否清楚)。埃里克的帖子结束了:
所有这一切,在实践中,有时候使用这种模式确实能够以C#中难以建模的方式实际解决问题;它允许你做一些关于虚拟方法没有协变返回类型以及类型系统的其他缺点这一事实的最终结果。这样做的方式严格来说,不会强制执行您可能喜欢的每个约束,这是不幸的,但在现实的代码中,通常不会阻止产品的运输。
我的建议是在实施此类之前要认真思考 C#中的好奇模式;为客户带来的好处真的超过了 与您在代码上放置的心理负担相关的成本 维护者吗
我所看到的这种模式的最佳用途是将所有重复的部分保留在内部或受到保护,并且公共API保持不变。
答案 1 :(得分:1)
'this'表示这个类的实例,所以你的代码在一分钟基本上会说“我想返回一个MyClass实例的数组”,这个实际上并没有用。
我想你想说'我想要返回这种类对象的数组'
因此,您将方法的返回类型指定为类名。
public YourClassName[] Search(string search)
{
}
答案 2 :(得分:0)
你的意思是,
public class YourClass
{
public T[] Search<T>(string search, Convertor<SearchResult, T> convertor)
{
...
List<SearchResult> results = ...
return results.ConvertAll(convertor).ToArray();
}
}
这样,您将转换委派给调用者,调用者将知道传递的类型作为泛型类型参数。