如何使用对象实现具有较少方法的旧版本的接口

本文关键字:方法 版本 接口 对象 何使用 实现 | 更新日期: 2023-09-27 18:30:35

我在应用程序中有一个程序集,定义了以下接口:

public void Method1()

然后我有一个实现此接口的程序集插件。它在运行时被发现并加载。

后来我修改了界面以包含一个新方法:

public void Method1()
public void Method2()

我创建了一个新的程序集插件来实现新版本的接口。

有没有办法在应用程序上仅部署新接口和新插件?目前,客户端永远不会在第一个插件上调用 Method2(),所以这应该不是问题(如果在任何时候在第一个插件上调用 Method2,我可以抛出异常)。

我以为我可以做到这一点,但我得到了一个TypeLoadException说:

程序集"提供程序

2,版本=1.0.0.0,区域性=中性,公钥令牌=null"类型"提供程序 2.Class2"中的方法"方法2"没有实现。

(这是真的,但由于不调用方法2应该不是问题)

如何使用对象实现具有较少方法的旧版本的接口

不应修改该接口。

接口通常以以下两种主要方式之一使用:

  1. 它们完全在应用程序内部使用
  2. 它们是公开的,从某种意义上说,其他人可以创建诸如插件之类的东西来实现或使用接口。

在第一个选项中,你当然可以自由地用它做任何你想做的事情,比如给它添加新的方法。如果这会产生很多编译器错误,那是您自己的问题,您也可以"轻松"修复这些错误。

在第二个选项中,您永远不应修改该接口。相反,您应该使用新方法创建一个新接口,然后编写代码,使其同时支持旧接口和新接口。

当然,除非你想完全禁止旧类工作,否则你又回到了你想做的任何事。

所以这里的答案是你不应该修改那个界面。而是使用新方法创建一个新接口,并支持旧版本和新版本。

每次更改接口时,都应尽量使用此方法,这包括更多类型的更改,而不仅仅是添加方法。

如果更改接口的含义,或修复主要的非灾难性错误,则可能需要引入新接口,并让旧接口具有旧错误。有人可能编写了依赖于旧行为的代码,无论好坏,您"修复"它可能会破坏过去工作的东西,即使编译器没有抱怨。

例如,假设您将比较结果传递给方法。您的文档指出,如果比较结果为<,则值将为负数,对于>为正值,对于==,则值将为 0。

然后你突然发现你没有返回 -1、0

或 +1,而是返回 -N、0 和 +N,其中 N 是比较的副产品,例如 A-B 的结果,所以在下一个版本中,你将其更改为 -1、0 和 +1。

某些代码可能依赖于这样一个事实,即这些值不仅表示比较的结果,而且确实是-N的,因此您解决此问题会破坏该代码。

当然,依赖未记录的行为总是不好的,但同样,您的客户很可能会因为代码曾经有效而您的更新破坏了它这一事实而挂断了。

因为不调用方法2应该不是问题

这不是 .Net 中的类型的工作方式。如果您的类声称它实现了接口,那么它只需要实现该接口。

您描述的内容类似于鸭子类型,.Net 使用它。