使用继承组织OOP

胡Je

柠檬和酸橙。 柠檬变酸,酸橙变酸。 柠檬有种子,酸橙有种子。 柠檬是黄色的,酸橙是绿色的。 等一下,情况有所不同。 我们首先开始描述柠檬和酸橙共有的所有特征,然后描述柠檬和酸橙本身特有的特征。 据我们所知,柠檬和酸橙具有一系列特征,同时也具有局部性。 柠檬和酸橙有什么关系? 它们有很多共同点,但同时又有很大的不同。

这些类型的场景经常在编程中发生,尤其是在面向对象编程(OOP)中。 假设我们正在建立这种柠檬/酸橙情景的模型。 首先,列出柠檬和酸橙之间的一些共同特征,并为它们创建方法。

柠檬和酸橙都有种子。 我们想要获得这些种子。 将其转换为柠檬和酸橙的简单方法可能看起来像这样。

  def播种 
把“切成两半,取种子”
结束

让我们再做一个。 柠檬和酸橙都有果汁。 一种获取果汁的简单方法可能如下所示。

 榨汁 
将“切成两半,榨汁”
结束

现在让我们做一些柠檬和酸橙特有的特征。 一个很好的例子是它们的颜色。 是时候创建一种获得其颜色的方法了。 请稍等,柠檬和酸橙是不同的颜色,因此我们需要单独的方法来获取其颜色。

  def what_color_is_a_lemon 
把“柠檬是黄色的”
结束
  def what_color_is_a_lime 
把“石灰是绿色的”
结束

从这些示例中,我们为柠檬类创建了3种方法,还为柠檬类创建了3种方法。 但是,它们共享2种常用方法,即# seeding和# juicing 。 当只有两个共同点时,为这两个类编写这些方法很容易,但是如果有更多共同点呢? 假设柠檬和酸橙类共有40种方法。 总共,我们将不得不编写80种方法,柠檬类为40种,而石灰类为40种。 那将是非常繁琐和重复的。 必须有一个更简单的方法。

这就是继承力。

继承是面向对象编程中最重要的概念之一。

“继承是从另一个类派生一个类的概念,该类用于共享一组属性和方法的类层次结构。”

—索本·詹森2017

较高的类(也称为超类)与较低的那些类具有相同的功能。 小写字母称为子类。

在ruby中,子类只能从一个其他类继承,而其他类型的编程语言可以具有多个要继承的类。 C ++是一种可以实现多继承的编程语言。

表示子类和超类之间的继承的符号包含<符号。 子类将放置在左侧,而超类将放置在右侧。 subclass < superclass

继承超级有用,因为它允许子类从超类继承方法,同时还允许子类为自己的类具有特定的方法。 在面向对象的程序设计中使用继承涉及封装。

“封装是面向对象编程的另一个基本概念,即将数据和功能打包到单个组件中。”

-Thibault 2014

封装的使用可以降低复杂度并提高代码效率

让我们回到柠檬和酸橙的场景,并应用继承! 通过继承,可以有子类和超类。 柠檬和酸橙将是子类,现在我们需要一个超类。 由于柠檬和酸橙都是水果,并且具有水果的许多特性,因此我们可以创建水果超类。 现在我们有了子类和超类,我们可以重新排列方法了。 由于seedingjuicing都是柠檬和酸橙类的方法,也是水果的特性,因此我们可以将这两种方法移至水果超类。 对于我们的颜色方法,由于柠檬和酸橙是不同的颜色,因此必须保留其特定的类别。 结果我们有了这个。

 水果类 
  def播种 
把“切成两半,取种子”
结束
 榨汁 
将“切成两半,榨汁”
结束
 柠檬<水果 
  def what_color_is_a_lemon 
把“柠檬是黄色的”
结束
 石灰<水果 
  def what_color_is_a_lime 
把“石灰是绿色的”
结束

由于继承,Lemon和Lime类都将能够使用水果中的方法,而每个类也都有自己的特定方法。 如果要在Fruits超类中创建更多方法,则柠檬和酸橙子类都可以调用这些方法! 太棒了!