继承静态类以覆盖成员

时间:2015-10-20 21:16:29

标签: c# inheritance static-methods sql-delete system.io.directory

我正在寻找专门覆盖System.IO.Directory类,因此我可以覆盖Delete方法,因为我收到的错误是“目录不为空”。我想保留该类的所有其他方法,只需为Delete方法的代码添加一些额外的逻辑,因为看起来导致错误的是服务器上尚未提交文件删除的服务器上的竞争条件在它报告所有文件已被删除之前。

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

任何人都可以建议一个代码模式来模拟静态继承而不包装System.IO.Directory类的每个公共成员吗?

1 个答案:

答案 0 :(得分:1)

简答:

您无法覆盖未设计为被覆盖的方法 - 这可以通过设计实现。

答案很长:

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

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

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

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

如果考虑.net框架库,它们也是如此 - 它们具有相互依赖性,并期望其他.net框架库以特定方式工作。其他框架类很可能会因为您甚至不知道的原因而调用System.IO.Directory.Delete方法,如果您改变了该方法的工作原理,它可能会破坏很多东西。

<强>备选方案:

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