是否可以这样做:
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)
{
...
}
}
答案 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)'