繁体   English   中英

如何将接口的实现作为返回类型返回?

[英]How to return an implementation of an interface with interface as return type?

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

我知道一个解决方案可能是返回基类“搜索”而不是接口的实现,但我不想这样做,并理解为什么我不能遵循我以前的模式。

任何帮助将不胜感激。 我正在努力大大简化发生的事情,所以如果需要澄清,请告诉我!

提前致谢。

尝试声明你这样的界面:

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

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

或者如果你总是使用SearchResult的'孩子:

interface ISearch<out T> where T : SearchResult { 
  // ...
}

更新

现在我知道你也在输入位置使用了type参数,你可以使用一个基本的非泛型接口:

interface ISearch { }
interface ISearch<T> : ISearch where T : SearchResult { }

// ...

public ISearch getSearchObject() { 
  return new FileSearch(); 
} 

或者隔离你的界面(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(); 
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM