基类与实用类

时间:2011-03-15 13:11:37

标签: c# java base derived

两者中哪一个应该首选?

有一些方法由A,B和C类调用。

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

OR

如果将这些方法封装在类U和其他类中,则可以根据需要使用这些方法。

应该根据什么做出决定?

感谢。

4 个答案:

答案 0 :(得分:9)

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

只有在实际有意义的情况下才使用继承 - 如果ABC实际上 D

答案 1 :(得分:3)

我根据方法的作用做出决定,如果他们正在做特定于A,B和C类的事情,那么他们应该在基类中。这有助于保持代码清洁,方法是将类相关功能隐藏在系统的其他部分之外。 (当然,我假设A,B和C已经从D继承,或者显然是相关的)

如果他们正在处理其他类型的东西,这些东西不是A,B和C所固有的,那么为了最大化重用的机会,他们应该在实用程序类中。

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

答案 2 :(得分:2)

除非有明显的是-a 关系,否则我会偏离继承。我怀疑你上面的描述并非如此。我的首选解决方案是:

  1. 将实用程序类的实例注入
  2. 让A,B,C实例化适当的实用程序类
  3. 注入该类的优点是您可以轻松地提供不同的实现。这对测试特别有用。使用静态方法的单身人士或类会因同样的原因而导致问题 - 你不能轻易地覆盖或替换它们。

答案 3 :(得分:0)

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

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

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