【发布时间】:2013-11-19 21:34:18
【问题描述】:
这里有一个有趣的问题。我有一个处理 System.Data 元素的类,这些元素最初是为了使用具体类作为参数而编写的。它最近更新为使用接口,以便我们与其他数据库具有更好的兼容性。
我的问题来自以下方法,以及它的更新对应:
旧:
public bool Transact(Func<DbTransaction, bool> functionBlock)
{
... Stuff ...
}
新:
public bool NewTransact(Func<IDbTransaction, bool> functionBlock)
{
... Stuff ...
}
旧版本导致DbTransaction 对象被吐出,我们可以将其发送到项目中的其他方法,而新版本则返回IDbTransaction。我将更新版本命名为 NewTransaction,这样如果最终与较新的库(DLL Hell 等)并排放置,旧项目就不会被破坏。
我可以将 NewTransact 重命名为 Transact 并且它会编译得很好,但我看不到一种方法可以调用另一个。我当前的解决方案可以正常工作,但最终 NewTransact 将不再是“新的”。到时候把旧的方法去掉,换个新的名字,只会让问题再次出现。
我的问题是:如果它们都同名,有没有办法选择调用哪个特定方法?
我猜没有,但我认为这是一个很好的问题。
编辑:这个问题的关键部分是保持向后兼容性。任何需要更新旧软件才能继续运行的答案都是无关紧要的。如果我想返回并更新其他项目,我会一开始就这样做,而不是创建这些重载。
【问题讨论】:
标签: c# interface delegates backwards-compatibility