组合是否应该专门用于继承,还是在不应该的情况下?

时间:2012-08-30 19:55:04

标签: c# inheritance encapsulation composition

在我想到的示例中,我有大约4行代码可以用函数封装,而且这个函数肯定会用在同一层次结构中的其他类中。

我有以下选项可以重复使用该代码:

  1. 将函数粘贴到需要它的类中。
  2. 为需要该函数的类创建一个基类并将其放在那里。
  3. 创建一个包含函数的类,该函数通过DI传递到需要它的类中,或者只是类的成员。 (看起来像是重大的矫枉过正)
  4. 创建一个静态实用程序类并将该方法放入其中。
  5. 我绝对不会做1或4.我过去会做2但是我试图保持组合而不是继承原则所以我倾向于4然而它似乎很多东西很可能永远不会在层次结构之外使用,只有4行。我知道这非常挑剔,但我想找出正确的方法。

4 个答案:

答案 0 :(得分:4)

继承是出于某种原因而创建的。它被过度使用这一事实并不意味着它没有合法用途。关键是你是否使用它不应该取决于你是否可以轻松地重用它,而是根据你的基类代表什么它是有意义它属于基类

如果没有更好地理解您的课程是什么,以及您尝试重用的方法是什么,我不能在您的特定情况下提供具体建议。但是这样想一想:当你说它“很可能永远不会在层次结构之外使用”时,是因为它纯粹只是在那个层次结构之外没有意义吗?或者只是你不认为有人会构建碰巧使用这个功能的东西,即使它可以想象在层次结构之外有意义吗?

如果这种方法会使任何感觉超出您所讨论的特定层次结构,我建议采用方法#3。

当然,所有这些都假定您的类层次结构首先是层次结构。另一种常见的继承滥用是当人们在不应该在其应用环境中采用分层的对象强制层次结构时。

答案 1 :(得分:2)

我同意组合是一种比继承更好的选择。但是,使用某种逻辑(可能是通过策略模式)编写对象与使用多个类重用相同代码不同。

如果那些需要此功能的类都具有相同的基类,那么将它放在基类中是有意义的。它不像子类需要知道基类的内部工作来进行这个调用。

如果各种子类需要不同版本的代码,那么通过策略模式(使用组合)创建行为是可行的方法。但我假设相同的代码满足每个子类。

我不会做#4,因为那个代码可用于没有业务调用它的其他类。如果代码在基类中,那么您可以使其受到保护,因此仅对需要它的类可用。

答案 2 :(得分:2)

如果这样的函数参数将成为类的字段,那么它的目的是在类的状态上运行,因此应该是处理这种操作的基类的成员。

如果您操作某些在层次结构之外或从层次结构的多个分支有意义的数据,并且参数的含义未绑定到对象状态,则使其成为实用程序类中的函数。

答案 3 :(得分:1)

如果它与您的类层次结构特别相关,请使用基类。如果没有,请使用选项4.此处无需合成。