CodeGo.net>如何返回一个接口的接口作为返回类型的实现?

我有一个接口: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();}

我知道一种解决方案可能是返回基类“ Search”而不是接口的实现,但是我不希望这样做,并且理解为什么我不能遵循以前的模式.

任何帮助将不胜感激.我正在尝试简化操作,因此,如果需要任何说明,请告诉我!

提前致谢.

解决方法:

尝试这样声明您的接口:

interface ISearch<out T> { 
  // ...
}

(假设FileSearchResult继承自SearchResult,并且type参数仅出现在接口的协变位置中)

或者,如果您将始终使用SearchResults的子级:

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(); 
} 
上一篇:面向对象之:继承(inheritance)


下一篇:有关扩展类的PHP继承问题