使用几乎相同的签名调用处理程序的最佳方式

问题描述 投票:0回答:1

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);

但是一个处理程序接受另一个参数,我试图找到最好的方法来做到这一点。

我最好的想法是制作另一个界面并检查主函数中的类型,但它看起来有点混乱

c# asp.net .net inheritance refactoring
1个回答
0
投票

解决您问题的方法是使

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
方法。这样您就不必在每个扩展类中实现该方法。

© www.soinside.com 2019 - 2024. All rights reserved.