如何从接口</t>实现方法<t>(T)

时间:2012-07-25 06:37:48

标签: c# interface

我正在建立一个小型基础架构,用于与不同的搜索系统(例如Apache Solr,SQL DB等)进行通信。对于每个系统,我有一个实现公共接口的单独类(=“communicator”),以便后续应用程序可以以相同的方式与所有搜索系统“对话”。此外,每个搜索系统都有自己的类,我用它来创建实际的查询。该单个查询类的对象保存所有相关的查询参数,并传递给相应的通信器类。所以对于Solr来说,它看起来像这样:

Solr solr = new Solr();
SolrQuery sQuery = new SolrQuery();
//use some methods on sQuery to specify the query
var result = solr.query(sQuery);

到目前为止一切顺利。但是如何在界面中指定查询方法呢? Solr类需要一个SolrQuery类型的对象。 MySQL类需要MySQLQuery类型的对象。

实现我想要的一个解决方案是:我改变整个界面:

interface ISearchTechnology<T>
{
  someReturnType query(T queryObject);
}

然后将Solr的类定义(例如)更改为

class Solr : ISearchTechnology<SolrQuery>

有效。但这在概念上毫无意义。 SolrQuery类型仅与此方法(查询)相关,而不适用于整个类。我可能需要包含其他类型(SolrQuery除外,例如SolrAnswer)。包括所有这些都是混乱的,并且违反了我对这个概念的理解。

我尝试将<T>部分附加到界面(query<T>(T queryObject))中的方法,但我还没有找到任何方法来实际实现它。

最后我想得到以下情况:每个communicator类都按接口的要求实现查询方法,但只接受一个与所有其他通信器类不同的参数的特定类型。

由于

2 个答案:

答案 0 :(得分:1)

即使从概念角度来看,您使用ISearchTechnology<T>的方法也是正确的。

答案 1 :(得分:0)

相反如何:

public interface ITechnology<TQuery, TSearch>
{
    TQuery Query(TQuery queryObject);
    TSearch Search(TSearch saerchObject);
}

public interface ISolrTechnology : ITechnology<SolrQuery, SolrSearch>
{
}

public class Solr : ISolrTechnology
{
    public SolrQuery Query(SolrQuery queryObject) {
        // ...
    }
    public SolrSearch Search(SolrSearch searchObject) {
        // ...
    }
}

interface ISolrTechnology当然是可选的。 class Solr可以继承ITechnology<SolrQuery, SolrSearch>本身。