100分 如何在接口中定义父类参数 在实现接口类中实现子类参数?

成都锦福工作室 2010-06-14 03:53:32
例如我有一个接口IData, 其中有一个方法 void ExecuteSql(string sqlString, params DbParameter[] cmdParms)
现在我有一个类SqliteData:IData, 希望实现 public void ExecuteSql(string sqlString, params SqliteParameter[] cmdParms)

但当我这样做了以后, 编译器告诉我没有实现父类的方法, 但DbParameter是SqliteParameter的父类。
如果我把接口类型修改为子类参数类型, 是可以编译通过的, 但可能以后这个接口会扩展Access或Sqlserver, 那么就不具备通用性了。

我考虑的解决办法是, 去掉接口中的这个方法来实现, 不过感觉很丑陋, 请问如果要实现我的需求, 应该如何做呢?
...全文
581 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzsh0622 2010-06-14
  • 打赏
  • 举报
回复
接口本身不提供成员的实现,接口只指定实现该接口的类必须提供的成员。一定要定义一个类,在类的方法中实现继承接口的方法。 你缺少的就是父类的方法实现。
捷哥1999 2010-06-14
  • 打赏
  • 举报
回复
实现的时候,会严格检查函数签名的,所以你可以这么做
1、实现多个方法,不同的方法支持不同的参数类型
2、你只是先一个方法,你调用的时候,可以将子类参数转型为父类参数,传递过去,就可以了!
兔子-顾问 2010-06-14
  • 打赏
  • 举报
回复
接口的定义就是需要你写一样的签名。如果你的泪中实现了
void ExecuteSql(string sqlString, params DbParameter[] cmdParms)
public void ExecuteSql(string sqlString, params SqliteParameter[] cmdParms)
那这实际就成了ExecuteSql的2个重载。你现在可以这样
public class SqliteData:IData
{
public void ExecuteSql(string sqlString, params DbParameter[] cmdParms)
{
List<SqliteParameter> p2 = new List<SqliteParameter>();
foreach(DbParameter dp in cmdParms)
{
if(dp is SqliteParameter) p2.Add(dp as SqliteParameter);
}
ExecuteSql(sqlString,p2.ToArray());
}

public void ExecuteSql(string sqlString, params SqliteParameter[] cmdParms)
{
//..实现略
}
}

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧