代码之家  ›  专栏  ›  技术社区  ›  Daniel Elliott

虚拟方法/属性的后果

  •  3
  • Daniel Elliott  · 技术社区  · 15 年前

    “流”!

    我最近在我的开发过程中使用了MOQ,我喜欢我能够实现的。

    但是,我发现我自己使我的方法(和mostpart的属性)虚拟化,这样我就可以在测试中将它们替换为模拟。

    除了“您正在使所有方法和属性都可覆盖”,这一行动过程还有什么现实世界的影响?

    谢谢你的时间,

    2 回复  |  直到 15 年前
        1
  •  10
  •   Robert Giesecke    15 年前

    好吧,你阻止了大多数的优化。 首先,抖动可能不知道将调用哪个实现(他不能,因为您可能正在使用模拟,对吗?) 所以,所有这些本应内联的属性访问器现在都将是真正的调用。对于内联,简单属性不会在运行时增加实际开销。虚拟属性不会被内联,所以它们是内联的。

    这是性能方面的问题,另一个问题是,您不能信任属性来工作,因为您认为它们是工作的。 每个属性都可以被重写。即使是你自己,因为“这一次真的很有意义,对吗?”。因此,您将发现自己比平时更经常检查调用树,以检查哪些实现适用于您正在处理的代码。

        2
  •  4
  •   Tom Dalling    15 年前

    我认为没有什么严重的后果。意外重写您不打算重写的方法/属性的可能性非常小。

    我认为用一个对象类替换另一个对象类(例如模拟对象)的能力是一件好事,要做到这一点,您需要一个具有虚拟方法/属性的基类。它提醒我使用抽象基类来遵循 Open Closed Principle .