8

两者中的哪一个应该是首选?

有一些方法被 A、B 和 C 类调用。

这些方法是否应该封装在 D 类(A、B 和 C 的基础)中?

或者

如果这些方法被封装在一个类 U 中并且其他类创建它的对象以根据需要使用这些方法。

应该在什么基础上做出决定?

谢谢。

4

4 回答 4

12

您应该创建一个static实用程序类。

仅在真正有意义时才使用继承——如果A, B, 并且C实际上D.

于 2011-03-15T13:12:53.170 回答
3

我会根据方法正在做什么来做出决定,如果它们正在做特定于 A、B 和 C 类的事情,那么它们应该在基类中。通过将与类相关的功能隐藏在系统的其余部分之外,这有助于保持代码整洁。(当然,我假设 A、B 和 C 要么已经从 D 继承,要么明显相关)

如果他们用其他类型做事情,那不是 A、B 和 C 所做的固有的事情,那么为了最大限度地提高重用机会,他们应该在实用程序类中。

如果他们正在使用特定于该其他类型的其他类型(例如漂亮地打印日期时间),请考虑为该类型创建扩展方法。

于 2011-03-15T13:16:28.013 回答
2

除非有明显的 is-a关系,否则我会倾向于远离继承。我从你上面的描述中怀疑情况并非如此。我首选的解决方案是:

  1. 将实用程序类的实例注入您的 A、B、C
  2. 让 A、B、C 实例化适当的实用程序类

注入类的优点是您可以轻松地提供不同的实现。这对于测试特别有用。具有静态方法的单例或类往往会出于同样的原因导致问题——您不能轻易地覆盖或替换它们。

于 2011-03-15T13:15:55.587 回答
-1

使用基类 如果你打算只根据基类编写一些逻辑——那么创建一个基类是有意义的。在这种情况下,您的派生类应该完全可以替代您的基类。不应该有任何开关逻辑来检查派生类型并采取相应措施。参见 Liskov 替换原则:http ://en.wikipedia.org/wiki/Liskov_substitution_principle

使用实用程序类 某些语言具有不支持多重继承的限制。如果您已经有一个有意义的基类,那么您需要使用实用程序类。此外,当您使用继承时,您正在创建从派生类到基类之间的紧密耦合。

如果派生类自然可以替代它的基类,我会选择基类。如果目的只是在类之间共享一些可重用的代码,那么使用实用程序类更有意义。

于 2011-03-15T13:29:17.113 回答