接口类型方法参数实现

时间:2008-09-19 08:40:44

标签: c# asp.net

是否可以这样做:

interface IDBBase {
     DataTable getDataTableSql(DataTable curTable,IDbCommand cmd);
     ...
}

class DBBase : IDBBase {
     public DataTable getDataTableSql(DataTable curTable, SqlCommand cmd) {
         ...
     }
}

我想使用该接口实现d / t提供程序(MS-SQL,Oracle ...);其中有一些签名要在实现它的相应类中实现。我也尝试过这样:

genClass<typeOj>
{
    typeOj instOj;

    public  genClass(typeOj o)
    {      instOj=o;    }


    public typeOj getType()
    {        return instOj;    }

...

interface IDBBase 
{
    DataTable getDataTableSql(DataTable curTable,genClass<idcommand> cmd);
    ...
}

class DBBase : IDBBase 
{
    public DataTable getDataTableSql(DataTable curTable, genClass<SqlCommand> cmd)
    {
        ...
    }
}

4 个答案:

答案 0 :(得分:3)

不,这是不可能的。方法应该具有与接口中声明的签名相同的签名。

但是您可以使用类型参数约束:

interface IDBClass<T> where T:IDbCommand
{
    void Test(T cmd);
}

class DBClass:IDBClass<SqlCommand>
{
    public void Test(SqlCommand cmd)
    {
    }
}

答案 1 :(得分:3)

除了将方法组分配给委托外,

Covariance and contravariance从C#3.0开始不受广泛支持。您可以通过使用私有接口实现来模拟它,并使用更具体的参数调用公共方法:

class DBBase : IDBBase {

    DataTable IDBBase.getDataTableSql(DataTable curTable, IDbCommand cmd) {
         return getDataTableSql(curTable, (SqlCommand)cmd); // of course you should do some type checks
     }

     public DataTable getDataTableSql(DataTable curTable, SqlCommand cmd) {
         ...
     }
}

答案 2 :(得分:1)

尝试编译它。如果DBBase未实现IDBBase,则编译器将报告错误。

答案 3 :(得分:1)

不,这是不可能的。我试着编译一下:

interface Interface1 { }
class Class1 : Interface1 {}

interface Interface2 { void Foo(Interface1 i1);}
class Class2 : Interface2 {void Foo(Class1 c1) {}}

我收到了这个错误:

  

'Class2'没有实现接口成员'Interface2.Foo(Interface1)'