返回

何时应用组合,而非继承?

闲谈

如今,许多程序员喜欢谈论这个面向对象设计的原则:优先考虑组合,而不是继承。然而,这句话本身的内涵与意图常常让人困惑和模糊。一些程序员不理解它,另一些程序员则错误地把它奉为真理和黄金法则。

什么是组合?

组合是一种将多个对象结合在一起形成一个新对象的方法。这种组合可以通过对象包含其他对象,或者通过对象引用其他对象来实现。组合的优点在于,它可以使您在不修改现有对象的情况下,轻松地添加或修改对象的行为。例如,您可以在一个新的对象中包含一个现有的对象,从而使新的对象具有现有对象的所有功能。

什么是继承?

继承是一种从一个现有对象中创建一个新对象的方法。新对象将继承现有对象的所有属性和方法,并且还可以添加自己的属性和方法。继承的优点在于,它可以使您轻松地创建具有相似行为的对象。例如,您可以从一个现有的动物对象中创建出一个新的狗对象,从而使狗对象具有动物对象的所有属性和方法,例如:名称、年龄、性别等。

何时使用组合,而不是继承?

一般来说,您应该在以下情况下使用组合,而不是继承:

  • 当您需要将多个对象组合在一起形成一个新的对象时。
  • 当您需要在不修改现有对象的情况下,添加或修改对象的行为时。
  • 当您需要创建具有相似行为,但又具有不同属性的对象时。

举个例子,假设您正在开发一个游戏。您需要创建一个玩家对象,该对象可以移动、跳跃和射击。您还可以创建一个敌人对象,该对象可以移动、跳跃和攻击玩家。

如果您使用继承,那么您可以从一个现有的对象(例如,一个角色对象)中创建出玩家对象和敌人对象。这样,玩家对象和敌人对象将具有相同的属性和方法。

但是,如果您使用组合,那么您可以创建一个新的对象(例如,一个游戏对象),该对象包含一个玩家对象和一个敌人对象。这样,游戏对象将具有玩家对象和敌人对象的所有属性和方法。

使用组合的优点是,您可以更轻松地添加或修改玩家对象和敌人对象的行为。例如,如果您想让玩家对象能够飞翔,那么您只需修改玩家对象的行为即可。而如果您使用继承,那么您需要修改所有从角色对象继承的类,包括玩家对象和敌人对象。

何时使用继承,而不是组合?

一般来说,您应该在以下情况下使用继承,而不是组合:

  • 当您需要创建具有相同行为和属性的对象时。
  • 当您需要重用现有对象的代码时。

举个例子,假设您正在开发一个图形编辑器。您需要创建一个形状对象,该对象可以移动、缩放和旋转。您还可以创建一个圆形对象,该对象是一个形状对象,具有半径属性。

如果您使用组合,那么您可以创建一个新的对象(例如,一个图形对象),该对象包含一个形状对象和一个圆形对象。这样,图形对象将具有形状对象和圆形对象的所有属性和方法。

但是,如果您使用继承,那么您可以从一个现有的对象(例如,一个形状对象)中创建一个圆形对象。这样,圆形对象将具有形状对象的所有属性和方法,并且还可以添加自己的属性和方法(例如,半径属性)。

使用继承的优点是,您可以更轻松地重用现有对象的代码。例如,如果您想创建一个新的形状对象,那么您只需从形状对象中继承即可。而如果您使用组合,那么您需要创建一个新的对象,并手动添加所有必要的属性和方法。

总结

组合和继承都是面向对象编程中常用的两种设计原则。组合是一种将多个对象结合在一起形成一个新对象的方法。继承是一种从一个现有对象中创建一个新对象的方法。

一般来说,您应该在以下情况下使用组合,而不是继承:

  • 当您需要将多个对象组合在一起形成一个新的对象时。
  • 当您需要在不修改现有对象的情况下,添加或修改对象的行为时。
  • 当您需要创建具有相似行为,但又具有不同属性的对象时。

一般来说,您应该在以下情况下使用继承,而不是组合:

  • 当您需要创建具有相同行为和属性的对象时。
  • 当您需要重用现有对象的代码时。