我在一个称为IDatabase的接口中声明了一个通用方法。然后,我在名为MsSql.cs的类中实现了该方法。但是错误消息说我没有实现该方法。我不知道怎么了。
我的代码如下。
在IDatabase中,我声明如下。
T BeginTransaction<T>(string connectionString);
在MsSql.cs中,我实现如下。
public SqlTransaction BeginTransaction(string connectionString)
{
tran_con = new SqlConnection(connectionString);
tran_con.Open();
SqlTransaction transaction = tran_con.BeginTransaction();
return transaction;
}
请让我知道为什么会发生错误。
答案 0 :(得分:1)
这不是通用方法的工作方式。您的界面期望的是具有相同签名的方法。在方法中使用<T>
时,意味着该方法是通用的,而不是可以用任何类型实现。要执行您想做的事情,可以使该接口具有通用性,例如。
interface IDatabase<T> {
T BeginTransaction(string connectionString);
}
class MsSql: IDatabase<SqlTransaction> {
public SqlTransaction BeginTransaction(string connectionString)
{
tran_con = new SqlConnection(connectionString);
tran_con.Open();
SqlTransaction transaction = tran_con.BeginTransaction();
return transaction;
}
}
另一方面,这是实现泛型方法的样子:
public T BeginTransaction<T>(string connectionString) {
// Code that generates any type T based on the connectionString
}
答案 1 :(得分:0)
如果您的界面要求输入T
,则必须提供T
,而不是SqlTransaction
,而后者与T
根本无关。
但是即使这些类型之间存在关联,您也不能期望编译器会猜测您想对SqlTransaction
使用T
。想象以下情况。您有一个接口实例:
IDatabase db = GetDatabaseInstance();
IDatabaseIDatabase
对GetDatabaseInstance
返回的实际基础类型一无所知。因此,即使您可以以这种方式实现BeginTransaction
,调用者也应该如何推断出该类型:
db.BeginTransaction(...); // what should this method return?
这里的唯一方法是使您的界面本身通用。然后,您可以在编译时指示T
是什么类型。