一邊寫 C++ Class 一邊了解 OOP 4 個概念

·

2 min read

四個概念

抽象(Abstraction)

Abstraction is selective ignorance.

– Andrew Koenig

從沒有任何 code 到生出一個 Car 的 class,我們想把車子抽象出以下東西:

  • move(double t): 移動 t 秒

所以可以寫出這樣的 class

struct Car final {
    Car() = default;
    ~Car() = default;

    void move(double t) {
        // 這行計算不算在抽象部分
        x_ += speed_ * t;
    }

    double x_ = 0;
    double speed_ = 60;
};

封裝(Encapsulation)

確保物件狀態良好。

假如我們不希望使用者隨意調整車子的速度和位置,那我們要把他 private 起來,並且,我們不希望 move 的時間是可以倒流的

class Car final {
public:
    Car() = default;
    ~Car() = default;

    void move(double t) {
        if (t < 0) {
            throw std::runtime_error("t is negative");
        }
        x_ += speed_ * t;
    }

private:
    double x_ = 0;
    double speed_ = 60;
};

繼承(Inheritance)

Car2 是一種 Car

class Car {
public:
    Car() = default;
    virtual ~Car() = default;
    // ...
};

struct Car2 : public Car {
};

多型(Polymorphism)

CarLazy 是一種 Car ,並且他會偷懶,只用一半的速度移動。

class Car {
public:
    Car() = default;
    virtual ~Car() = default;

    virtual void move(double t) {
        if (t < 0) {
            throw std::runtime_error("t is negative");
        }
        x_ += speed_ * t;
    }

// 給繼承人使用
protected:
    double x_ = 0;
    double speed_ = 60;
};

class CarLazy : public Car {
public:
    void move(double t) override {
        if (t < 0) {
            throw std::runtime_error("t is negative");
        }
        x_ += speed_ * t / 2;
    }
};

參考