标题有点拗口难懂,用代码来说比较浅显,其实是要实现以下效果:
class Base
{
// 基类中定义一个虚方法 ExecuteNonQuery,用以执行一段 SQL 查询,并传递一个参数
public virtual int ExecuteNonQuery(string Query, DbParameter Parameter)
{
return 1;
}
}
class SqlServer : Base
{
// 子类中重写该方法,接受单个参数,参数可以是 SqlParameter 类型,因其继承自 DbParameter
public override int ExecuteNonQuery(string Query, DbParameter Parameter)
{
SqlCommand _SqlCommand = new SqlCommand();
_SqlCommand.Parameters.Add(Parameter);
return 100;
}
}
class main
{
static void Main()
{
Base _Base = new SqlServer();
SqlParameter _Param = new SqlParameter();
Console.WriteLine("ExecuteNonQuery: {0}", _Base.ExecuteNonQuery("", _Param));
/* 可以正确执行
* */
Console.ReadLine();
}
}
class Base
{
// 基类中定义一个虚方法 ExecuteNonQuery,用以执行一段 SQL 查询,并传递多个不固定数量的参数
public virtual int ExecuteNonQuery(string Query, List<DbParameter> Parameters)
{
return 2;
}
}
class SqlServer : Base
{
// 子类中重写该方法,以接受多个不固定数量的参数
public override int ExecuteNonQuery(string Query, List<DbParameter> Parameters)
{
SqlCommand _SqlCommand = new SqlCommand();
foreach (DbParameter parm in Parameters)
{
_SqlCommand.Parameters.Add(parm);
}
return 200;
}
}
class main
{
static void Main()
{
Base _Base = new SqlServer();
List<SqlParameter> _Params = new List<SqlParameter>();
Console.WriteLine("ExecuteNonQuery: {0}", _Base.ExecuteNonQuery("", _Params));
/* 无法通过编译
* 错误提示:
* has some invalid arguments
* 因为:
* cannot convert from 'System.Collections.Generic.List<System.Data.SqlClient.SqlParameter>' to 'System.Collections.Generic.List<System.Data.Common.DbParameter>'
* */
Console.ReadLine();
}
}
这时却得到了错误,因为无法进行类型转换,可以发现:
- 单个参数时可以正确传递子类类型,比如 SqlParameter ,因其继承自 DbParameter;
- List 参数的时候,无法传递 List 的子类类型
class Base
{
// 基类中定义一个虚方法 ExecuteNonQuery,用以执行一段 SQL 查询,并传递多个不固定数量的参数
public virtual int ExecuteNonQuery<T>(string Query, List<T> Parameters) where T:DbParameter
{
return 3;
}
}
class SqlServer : Base
{
// 子类中重写该方法,以接受多个不固定数量的参数
public override int ExecuteNonQuery<T>(string Query, List<T> Parameters)
{
SqlCommand _SqlCommand = new SqlCommand();
foreach (DbParameter parm in Parameters)
{
_SqlCommand.Parameters.Add(parm);
}
return 300;
}
}
class main
{
static void Main()
{
Base _Base = new SqlServer();
List<SqlParameter> _Params = new List<SqlParameter>();
Console.WriteLine("ExecuteNonQuery: {0}", _Base.ExecuteNonQuery("", _Params));
/* 可以正确执行
* (^o^)/YES!
* */
Console.ReadLine();
}
}