我有一个接口:ISearch<T>
我有一个实现此接口的类:FileSearch : ISearch<FileSearchResult>
我有一个类FileSearchArgs : SearchArgs
,它有一个返回搜索对象的方法:
public override ISearch<SearchResult> getSearchObject ()
{
return ((ISearch<SearchResult>)new FileSearch());
}
这被覆盖:
public virtual ISearch<SearchResult> getSearchObject () { return null; }
代码只会在我向(ISearch)提供强制转换的情况下构建,但它会在运行时抛出异常并且无法转换错误。此外,前一次迭代没有将泛型应用于接口,因此getSearchObject()
的方法签名如下:
public override ISearch getSearchObject() { return new FileSearch();}
我知道一个解决方案可能是返回基类“搜索”而不是接口的实现,但我不想这样做,并理解为什么我不能遵循我以前的模式。
任何帮助,将不胜感激。我正在努力大大简化发生的事情,所以如果需要澄清,请告诉我!
提前致谢。
答案 0 :(得分:3)
尝试声明这样的界面:
interface ISearch<out T> {
// ...
}
(假设FileSearchResult
继承自SearchResult
,并且type参数仅出现在接口的协变位置中)
或者如果你总是使用SearchResult
s'孩子:
interface ISearch<out T> where T : SearchResult {
// ...
}
<强>更新强>:
现在我知道你也在输入位置使用了type参数,你可以使用基本的非泛型接口:
interface ISearch { }
interface ISearch<T> : ISearch where T : SearchResult { }
// ...
public ISearch getSearchObject() {
return new FileSearch();
}
或segregate your interfaces (pdf)(如果这对你有意义):
interface ISearchCo<out T> where T : SearchResult {
T Result { get; }
}
interface ISearchContra<in T> where T : SearchResult {
T Result { set; }
}
// ...
public ISearchCo<SearchResult> getSearchObject() {
return (ISearchCo<SearchResult>)new FileSearch();
}