我实现了在接口中声明的通用方法,但出现错误

时间:2019-04-01 14:15:06

标签: c# generics

我在一个称为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; 
}

请让我知道为什么会发生错误。

2 个答案:

答案 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();

IDatabaseIDatabaseGetDatabaseInstance返回的实际基础类型一无所知。因此,即使您可以以这种方式实现BeginTransaction,调用者也应该如何推断出该类型:

db.BeginTransaction(...);  // what should this method return?

这里的唯一方法是使您的界面本身通用。然后,您可以在编译时指示T是什么类型。