继承静态 class 以覆盖成员

Inheriting a static class in order to override members

我正在寻找具体覆盖 System.IO.Directory class 的方法,这样我就可以覆盖 Delete 方法,因为我收到一个错误 "directory is not empty"。我想保留 class 的所有其他方法,只需在 Delete 方法的代码中添加一些额外的逻辑,因为似乎导致错误的是服务器上的竞争条件,其中文件删除尚未完成在服务器报告所有文件已被删除之前在服务器上提交。

我可以在另一个 class 中编写一个自定义函数来执行此操作,但我的公司生产它自己的框架,我认为它对其他可能 运行 的开发人员很有用也有错误。

任何人都可以提出一个代码模式来模拟静态继承而不包装 System.IO.Directory class 的每个 public 成员吗?

简答:

您不能覆盖未设计为可覆盖的方法 - 这是设计使然。

长答案:

库具有相互依赖关系,假设您有以下加载的依赖关系:

Main.exe
   | ->  A.dll
   |       |
   |       v
   | ->  B.dll     

A.dll 的开发者依赖于 B.dll,他们对 B.dll 的工作方式有一定的期望。

如果允许您以未定义的方式(不使用继承)更改 B 的行为,那么 A.dll 的开发人员将不会相信 B.dll 会按照他们的期望进行操作,这将是违反直觉和容易出错的。 (这也是 sealed 关键字存在的原因)

如果您考虑 .net 框架库,这也是正确的 - 它们相互依赖并期望其他 .net 框架库以特定方式工作。很可能其他框架 classes 调用 System.IO.Directory.Delete 方法是出于您永远不会知道的原因,如果您更改该方法的工作方式,它可能会破坏很多东西。

备选方案:

一个建议是创建一个 DirectoryEx class,它可以在那里静态定义您的自定义 Delete 方法。您可以在自己的代码中使用您的自定义方法,但其他代码(不是您编写的)仍然相信 delete 方法按预期工作。