2011-03-15 60 views
5

哪两个应该是首选?基本类与效用类

有一些方法,其是由类A,B和C.

称为如果这些方法中的一类d(A,B和C的基极)被封装?

OR

如果这些方法在U类和其他类。外币它的对象使用的方法根据需要进行封装。

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

谢谢。

+4

类A,B和C之间是否存在任何概念关系? – 2011-03-15 13:14:16

+0

如何通过A,B,C制作界面并实现它? – 2011-03-15 13:17:07

+0

@p:只有它们构造D类使用的数据。A需要与其他类不同的输入。 @Srinivas:这些方法的实现对于A,B和C来说是完全相同的。 – Azodious 2011-03-15 13:22:48

回答

9

您应该制作一个static实用程序类。

只有使用继承,如果它实际上是有意义—如果ABC实际上一个D

+0

是的,我想。 D有调用三种类型算法的方法。 A,B和C构造特定于算法的数据并调用这些常用方法来执行。 – Azodious 2011-03-15 13:16:45

+0

@Azo:细节总是有帮助的。在这种情况下,也许你应该使用继承,用'A','B'和'C'覆盖'abstract'方法。 – SLaks 2011-03-15 13:17:52

+0

我完全同意你的第二点,但我只会建议使用静态工具类,其中实用工具方法没有状态(即没有静态变量),并且不执行任何带有副作用的操作(文件IO或数据库活动等) 。如果你是单元测试A,B和C,那么使用模拟对象将它们与静态工具类分离(几乎)是不可能的。使用通过构造器注入传递给A/B/C的非静态工具类会更好。那么你的代码是高度可配置的,并通过聚合获取行为。 – sheikhjabootie 2011-03-15 13:26:52

2

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

  1. 注入一个实用工具类的一个实例,为你的A,B,C
  2. 有A,B,C实例化适当的实用工具类

优势注入类的方法是你可以简单地提供不同的实现。这对测试特别有用。使用静态方法的单身人士或班级往往会出于同样的原因导致问题 - 您无法轻易覆盖或替换它们。

3

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

如果他们正在做其他类型的事情,那不是固有的A,B和C,那么为了最大化再利用的机会,他们应该在实用类中。

如果他们正在处理其他类型的特定于其他类型的事物(例如,漂亮地打印日期时间),请考虑将它们作为的扩展方法类型。

+1

+1:你打败了我。正如SLaks提到的那样,OP似乎也没有意识到静态函数。也许值得一提的是,对于公用事业类。 – 2011-03-15 13:18:31

0

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

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

如果派生类自然可以替代它的基类,我会去基类。如果目的只是为了在类之间共享一些可重用的代码,那么使用实用类更合理。