基类与实用类

8

这两种方法哪种更好?

有一些方法是由类A、B和C调用的。

这些方法应该封装在一个类D中(作为A、B和C的基类)吗?

还是应该将这些方法封装在一个类U中,其他类创建它的对象以根据需要使用这些方法。

应该根据什么标准做出决策?

谢谢。


4
类别 A、B 和 C 之间是否存在概念关联? - 一二三
做一个接口,然后通过A、B、C来实现怎么样? - Srinivas Reddy Thatiparthy
@p: 仅仅是它们构建了类D所使用的数据。A需要与其他类不同的输入。 @Srinivas: 这些方法的实现对于A、B和C来说完全相同。 - Azodious
4个回答

12

你应该创建一个静态实用类。

只有在确实意义上需要时才使用继承——如果ABC实际上确实是一个D


是的,我猜是这样的。D具有调用三种类型算法的一些方法。A、B和C构造特定于算法的数据,并调用那些通用方法进行执行。 - Azodious
@Azo:细节总是很重要的。在这种情况下,也许你应该使用继承,通过abstract方法被ABC覆盖。 - SLaks
我完全同意你的第二个观点,但我只建议在实用方法没有状态(即没有静态变量)并且不执行具有副作用的操作(例如文件IO或数据库活动等)时使用静态实用程序类。如果您正在对A、B和C进行单元测试,几乎不可能将它们与带有模拟对象的静态实用程序类解耦。最好使用非静态实用程序类,通过构造函数注入传递给A/B/C。然后您的代码高度可配置,并通过聚合获取行为。 - sheikhjabootie
@Azodius - 看看策略设计模式(http://en.wikipedia.org/wiki/Strategy_pattern)。你有一个抽象基类和定制算法的子类。听起来正是你需要的。 - sheikhjabootie
@Xcal:你说得没错,但是你对他的代码库质量做出了不必要的假设。 - SLaks

3
我会根据方法的作用来做出决定,如果它们是针对A、B和C类特定的操作,那么它们应该在基类中。这有助于将与类相关的功能隐藏起来,使代码更加清晰。当然,我假设A、B和C要么已经从D继承,要么显然与D有关。
如果它们与其他类型一起工作,而这些类型与A、B和C所固有的不同,则为了最大化重用机会,它们应该在实用程序类中。
如果它们正在处理其他类型的特定内容(例如,美化日期时间),则考虑将它们作为扩展方法添加到那个类型中。

1
+1:你比我先说了。正如SLaks所提到的,似乎OP不知道静态函数。对于实用类,也许值得一提。 - Steven Jeuris

2
我认为,在没有明显的“是一个”关系时,应该避免使用继承。从您上面的描述中,我怀疑这种情况并不适用。我的首选解决方案如下:
  1. 向A、B、C中注入实用程序类的实例
  2. A、B、C实例化适当的实用程序类
注入类的优点在于您可以轻松地提供不同的实现,这对测试特别有用。单例或具有静态方法的类往往会出现问题,因为您无法轻松地覆盖或替换它们。

-1

使用基类 如果您将编写一些仅依赖于基类的逻辑 - 那么创建一个基类是有意义的。在这种情况下,派生类应完全可替换为基类。不应该有任何开关逻辑来检查派生类型并相应地行事。请参见Liskov替换原则:http://en.wikipedia.org/wiki/Liskov_substitution_principle

使用实用程序类 有些语言有限制,它们不支持多重继承。如果您已经有了一个有意义的基类,则需要使用实用程序类。此外,当您使用继承时,从派生类到基类的耦合非常紧密。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接