我对泛型(即T在C#中的工作方式)感到困惑。它的行为似乎与C++不同,除非我弄错了。我试图为数据网关创建一个简单的接口:
编辑更新以匹配答案。Visual现在抱怨派生类不实现接口方法。
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() { }
}我不知道将传递哪种类型,这就是我试图使用泛型的原因。
发布于 2013-04-23 18:49:09
您将对每个方法分别声明类型参数。您应该在接口类型本身上声明它。
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() { }
}为了澄清,您当前的实现可以重写为:
public interface IDataGateway
{
void InsertRow<T>(T row);
void UpdateRow<U>(U row);
IEnumerable<V> GetTable(V table);
}也就是说,不需要T与U和V相同。每个方法都通过自己的类型参数进行泛化,但包含的接口类型本身并不是泛型的。
通过在类型本身上声明类型参数,可以限制方法的类型参数在由子类实现时是相同的。用您似乎熟悉的C++术语来说,您当前的实现类似于三个单独的模板函数,而我的实现更类似于一个模板类。
发布于 2013-04-23 18:48:57
看起来,您正在尝试创建和实现泛型接口,而不是泛型方法。
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.InsertRow对Media类型的项进行专门操作。IDataGateway<T>的其他实现可以对其他类型进行操作,但LibraryGateway只对Media对象进行操作。
发布于 2013-04-23 18:51:50
从您的示例中,我认为最有效的方法是使接口本身成为通用的,而不是其中的方法:
public interface IDataGateway<T>
{
void InsertRow(T row);
void UpdateRow(T row);
IEnumerable<T> GetTable(T table); // ???
}我认为您的GetTable()方法也需要修复--如果T是表中包含的对象的类型,那么它(可能!)也不是表的类型。也许你是说IEnumerable<T> GetTable();
然后你就可以:
public class LibraryGateway : IDataGateway<Media>
{
public void InsertRow(Media item) { }
public void UpdateRow(Media item) { }
public IEnumerable<Media> GetTable() { }
}...and,我认为这应该能做你想要的。
https://stackoverflow.com/questions/16176916
复制相似问题