TypeScript 面向对象编程 – 抽象

抽象是面向对象编程又名 OOP 的概念之一,它能够从旨在保留关键方面的事物中删除不必要甚至复杂的特征。 我知道它真的看起来像:WTH!? 但是让我们举例和简化它,我不会用汽车的例子,我保证!

汽水机怎么样? 这可能是抽象的一个很好的例子。 要从汽水机中获取苏打水,我们无需知道在汽水机中按下分配器标签时会即时制作饮料。 加压二氧化碳罐和水泵将加压二氧化碳气体和冷水送入碳酸化器,在碳酸化器中混合,气体溶解到水中,然后加一点调味糖浆,瞧,这就是你的饮料。

在这种情况下,对我们来说重要的是能够按下按钮并等待我们的饮料,仅此而已,所以在这个抽象场景中,“按下这个按钮来喝一杯”是基本特征。 另一方面,假设你是一名工程师,并且有一些电话说按钮有时会卡住并且你需要修复它,到目前为止,仅知道如何喝水不足以修复机器,因此你需要深入了解并 知道汽水机是如何工作的,才能处理这个问题。

让我们开始编码

仍然使用汽水机的例子,让我们编写一些代码,我们需要在一个类中改造这台机器,目前我们知道的是:有一个独特的按钮,当按下时会掉一些汽水:

/**
 * The Soda Fountain machines class
 */
class SodaMachine {
    /**
     * Returns the soda when pushed
     */
    doPush() {
        console.log('get your soda')
    }
}

const soda = new SodaMachine()
soda.doPush()

L#4 — 创建一个 SodaMachine 类,它代表了汽水机蓝图

L#8 – 设置一个 doPush 方法,当推时会掉苏打水

L#13 — 使用 soda 常量实例化 SodaMachine 类

L#14 — 从实例化为 soda 的 SodaMachine 类调用 doPush 方法

假设我们仍在构建我们的汽水机,我们需要添加更多按钮,所以在这个新版本中,我们的机器将不只包含一个按钮,但现在我们可以提供另外两种口味,总共三种。

考虑到现在我们有更多关于我们机器的信息,让我们假设口味是:可乐、柠檬和橙子,所以让我们编码吧!

/**
 * The Soda Fountain machines class
 */

/**
 * Friendly enum for Soda Flavours
 */
enum ESodaFlavours {
    COCA,
    LEMON,
    ORANGE
}

class SodaMachine {
    /**
     * Returns the soda when pushed
     */
    doPush(flavour: ESodaFlavours) {
        console.log(`get your soda flavour ${ESodaFlavours[flavour]}`)
    }
}

const soda = new SodaMachine()

soda.doPush(0)
soda.doPush(1)
soda.doPush(2)

L#8 — 添加 ESodaFlavours 枚举以帮助机器识别所选风味

L#8 — 为 doPush 方法添加一个风味参数,它应该是 ESodaFlavours 枚举中的一个项目

L#25, L#26, L#27 – 模拟三种不同的按钮场景

我们的机器快完成了,我们只需要添加一些冰块,所以我们将添加一个与其他按钮完全不同的新按钮,按下它应该会掉落一些冰块:

/**
 * The Soda Fountain machines class
 */

/**
 * Friendly enum for Soda Flavours
 */
enum ESodaFlavours {
    COCA,
    LEMON,
    ORANGE
}

class SodaMachine {
    /**
     * Returns the soda when pushed
     */
    dropSoda(flavour: ESodaFlavours) {
        console.log(`get your soda flavour ${ESodaFlavours[flavour]}`)
    }

    /**
     * Drops ice cubes when pushed
     */
    dropIce() {
        console.log(`get your ice cubes`)
    }

}

const soda = new SodaMachine()

soda.dropSoda(0)
soda.dropIce()

soda.dropSoda(1)

soda.dropSoda(2)
soda.dropIce()

L#18 — 从 doPush 到 dropSoda

L#25 — 添加 dropIce 方法来处理冰块请求

L#33, L#33 – 模拟用户请求加冰的苏打水的场景

我们终于完成了我们的汽水机制造并准备发布!

简而言之,抽象是指表示基本方面的行为,省略不必要的特征,就像我们之前所做的那样,抽象是 OOP 的一个有用的关键概念,它帮助我们在蓝图中转换了现实世界的机器。