首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#接口和泛型

C#接口和泛型
EN

Stack Overflow用户
提问于 2013-04-23 18:46:38
回答 7查看 221关注 0票数 1

我对泛型(即T在C#中的工作方式)感到困惑。它的行为似乎与C++不同,除非我弄错了。我试图为数据网关创建一个简单的接口:

编辑更新以匹配答案。Visual现在抱怨派生类不实现接口方法。

代码语言:javascript
复制
public interface IDataGateway<T>
{
    void InsertRow(T row);
    void UpdateRow(T row);
    IEnumerable<T> GetTable();
}

public class LibraryGateway : IDataGateway<Media>
{
    public void InsertRow(Media item) { }
    public void Updaterow(Media item) { }
    public IEnumerable<Media> GetTable() { }
}

我不知道将传递哪种类型,这就是我试图使用泛型的原因。

EN

回答 7

Stack Overflow用户

发布于 2013-04-23 18:49:09

您将对每个方法分别声明类型参数。您应该在接口类型本身上声明它。

代码语言:javascript
复制
public interface IDataGateway<T>
{
    void InsertRow(T row);
    void UpdateRow(T row);
    IEnumerable<T> GetTable(T table);
}

public class LibraryGateway : IDataGateway<Media>
{
    public void InsertRow(Media item) { }
    public void Updaterow(Media item) { }
    public IEnumerable<Media> GetTable() { }
}

为了澄清,您当前的实现可以重写为:

代码语言:javascript
复制
public interface IDataGateway
{
    void InsertRow<T>(T row);
    void UpdateRow<U>(U row);
    IEnumerable<V> GetTable(V table);
}

也就是说,不需要TUV相同。每个方法都通过自己的类型参数进行泛化,但包含的接口类型本身并不是泛型的。

通过在类型本身上声明类型参数,可以限制方法的类型参数在由子类实现时是相同的。用您似乎熟悉的C++术语来说,您当前的实现类似于三个单独的模板函数,而我的实现更类似于一个模板类。

票数 2
EN

Stack Overflow用户

发布于 2013-04-23 18:48:57

看起来,您正在尝试创建和实现泛型接口,而不是泛型方法。

代码语言:javascript
复制
public interface IDataGateway<T>
{
    void InsertRow(T row);
    void UpdateRow(T row);
    IEnumerable<T> GetTable(T table);
}

public class LibraryGateway : IDataGateway<Media>
{
    public void InsertRow(Media item) { }
    public void Updaterow(Media item) { }
    public IEnumerable<Media> GetTable(Media table) { }
}

当您有一个泛型方法时(如在最初的问题中),它意味着单个实现(例如LibraryGateway.InsertRow)可以使用任何类型的参数调用--只有在运行时才知道。但是,在实现泛型接口时,可以将接口参数化,以便LibraryGateway.InsertRowMedia类型的项进行专门操作。IDataGateway<T>的其他实现可以对其他类型进行操作,但LibraryGateway只对Media对象进行操作。

票数 1
EN

Stack Overflow用户

发布于 2013-04-23 18:51:50

从您的示例中,我认为最有效的方法是使接口本身成为通用的,而不是其中的方法:

代码语言:javascript
复制
public interface IDataGateway<T>
{
  void InsertRow(T row);
  void UpdateRow(T row);
  IEnumerable<T> GetTable(T table); // ???
}

我认为您的GetTable()方法也需要修复--如果T是表中包含的对象的类型,那么它(可能!)也不是表的类型。也许你是说IEnumerable<T> GetTable();

然后你就可以:

代码语言:javascript
复制
public class LibraryGateway : IDataGateway<Media>
{
  public void InsertRow(Media item) { }
  public void UpdateRow(Media item) { }
  public IEnumerable<Media> GetTable() { }
}

...and,我认为这应该能做你想要的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16176916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档