【问题标题】:Base-Class implementation considerations基类实现注意事项
【发布时间】:2010-12-17 16:24:30
【问题描述】:

我写了一个类来做某事,一段时间后我发现许多其他类共享该功能,因此决定实现一个基类(C# 中的抽象)并将所有共享放入其中。

既然无法实例化这样的类,那么如何调试呢?

开发基类有什么实际的考虑吗?

【问题讨论】:

  • 只需实例化其子类之一...
  • 事实上,我正在为实现相同接口的类添加一些共享功能。

标签: c# inheritance base-class


【解决方案1】:

调试抽象类

没有什么能阻止您调试抽象类,当调试您的子类时,调试器会根据需要自动将您重定向到父类的实现。

设计类层次结构

虽然在 .NET 中继承很简单,但如果没有清晰的类层次结构,它很快就会变得难以维护。

继承并不是确保在 OO 中重用的唯一方法。

一些可能有帮助的建议:

  • 确保您的基类有明确的职责
  • 保持低继承深度。
  • 倾向于支持composition 而不是继承。 (使用interfaces 可能是一个不错的选择)

【讨论】:

    【解决方案2】:

    如果你需要测试它,你可以做以下两件事之一:

    1) 您可以拥有非抽象的基类,因此可以对基类进行实例化并进行测试。

    2) 在您的测试项目中,您可以围绕基础制作一个模拟包装器并测试该模拟。

    【讨论】:

      【解决方案3】:

      因为无法实例化 那么这样的类怎么调试呢?

      如果你问如何实际测试它(即单元测试),我通常会编写一个从基类继承的测试类并以这种方式进行测试。如果您询问实际调试,那么一旦您在正在运行的应用程序中使用子类实例化它,它就与任何其他类没有什么不同。这有意义吗?

      有没有实际的考虑 用于开发基类?

      多年来,我听说过两种关于此的流派:1)将任何常见的东西放入基类中;2)如果基类不是真正的继承,则不要创建基类。我倾向于对前者进行设计/编码,但#2 确实有其优点,因为它可以在某种程度上使设计与直觉相反。只是我的 0.02 美元...

      【讨论】:

        【解决方案4】:

        我会制作一个模拟对象,让您从新的抽象中继承。您甚至可以使用模拟框架来执行此操作。

        保留它以运行您的单元测试,除非您使用 Rhino Mocks(我个人最喜欢的模拟框架)之类的东西。

        【讨论】:

        • 我想在开发的最后阶段把它抽象化
        • 您的意思是解决您的问题吗?我不会走那条路,因为你会想以与使用它相同的方式对其进行测试。
        • 并且您不需要将其抽象为从类继承。您始终可以使用它继承自的具体类。
        【解决方案5】:

        要调试基类,请创建派生类之一的实例并通过它进行调试。

        您也可以考虑创建另一个派生类,它除了从基类继承之外什么都不做,以便您对其进行测试。

        【讨论】:

          【解决方案6】:

          首先,它不需要是抽象的,你的类可以继承它,如果它不是抽象的,你可以实例化它。否则,只需在具体实现中调试它

          【讨论】:

            【解决方案7】:

            您可以在测试夹具程序集中创建一个派生版本(我假设您正在对基础进行单元测试,因此需要单独实例化它)只是为了测试基类的功能。派生版本将提供测试基础所需的任何额外基础设施。您可能决定创建几个派生版本来测试抽象基础的不同方面。

            【讨论】:

              【解决方案8】:

              您可以使用从它继承的派生类对其进行调试。在调试它时,您需要记住您所做的任何更改并查看结果行为是否仍由所有派生类共享。

              【讨论】:

                猜你喜欢
                • 2017-11-06
                • 1970-01-01
                • 1970-01-01
                • 2010-11-16
                • 1970-01-01
                • 1970-01-01
                • 2014-04-08
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多