public class Config {
static Dictionary<int, IHandler handler> dictionary = new Dictionary<int, IHandler>() {
{ 0, new Handler() },
{ 1, new Handler() },
{ 2, new SecondHandler() }
};
public static IHandler Get(int id) { return dictionary[id].handler; }
}
interface IHandler {
void Execute(SqlConnection sqlConnection, SqlTransaction transaction, List data);
}
class Handler : IHandler {
public void Execute(SqlConnection sqlConnection, SqlTransaction transaction, List data) {
...
}
}
interface IHandlerSecond {
void Execute(SqlConnection sqlConnection, IConnection connection, SqlTransaction transaction, List data);
}
class SecondHandler : Handler, IHandlerSecond {
public void Execute(SqlConnection sqlConnection, IConnection connection, SqlTransaction transaction, List data) {
base.Execute(sqlConnection, connection, transaction);
...
}
}
void Main(IConnect connect) {
// Some code
var handler = Config.Get(num);
if(handler is IHandlerSecond) {
(handler as IHandlerSecond).Execute(connect, iconnection, transaction, data);
}
else if (handler is IHandler) {
(handler as IHandler).Execute(connect, transaction, data);
}
}
所以基本签名看起来像
void Execute(SqlConnection sqlConnection, SqlTransaction transaction, List data);
但是一个处理程序接受另一个参数,我试图找到最好的方法来做到这一点。
我最好的想法是制作另一个界面并检查主函数中的类型,但它看起来有点混乱
解决您问题的方法是使
IHandler
延长 IHandlerSecond
。
这样你只需要检查
handler
是否实现了IHandlerSecond
(它会自动实现IHandler
。
因为如果您拥有
IHandlerSecond
的所有数据,您也可以随时调用 IHandler
,因为它需要参数的子集。
最终界面看起来像这样:
interface IHandler : IHandlerSecond {
void Execute(SqlConnection sqlConnection, SqlTransaction transaction, List data);
void IHandlerSecond.Execute(SqlConnection sqlConnection, IConnection connection, SqlTransaction transaction, List data)
{
Execute(sqlConnection, transaction, data);
}
}
请注意,在此示例中,
IHandlerSecond
接口如何自动实现以重定向到 IHandler
方法。这样您就不必在每个扩展类中实现该方法。