Interface, Abstract Class, 與 Concrete Class 的不同。

我們都知道要訂 Pizza,就會要知道 Pizza 店的電話,然後打給他。等到送達後,再開門見到穿著制服的員工,向他收下 Pizza。

然而每個 Pizza 店都會照著這個協定走:

  • &1提供電話
  • &2讓你打電話訂餐
  • &3送貨員送 Pizza 到你家

這個 協定 就是 Interface

struct PizzaShop
{
  virtual string phoneNumber() = 0;
  virtual bool call() = 0;
    virtual void deliverPizza() = 0;
};

當你想要吃 PizzaHut 的 Pizza 時,你大概知道打電話的流程是什麼,也預期送貨員會穿著紅色的制服,交給你 Pizza。
但是知道這個還不夠,你需要"實際的店家"的幫你作,幫你送,還要知道實際的電話才打去。

大部分的訂 Pizza 行為都知道,但是還有些尚未確定的資訊,需要真正存在的分店來提供,的這種 概念,就是一種 Abstract Class

你甚至不能只靠 PizzaHut 來取得 Pizza,你需要下面所提到的 PizzaHut 分店,才能獲取實際熱騰騰的 Pizza。

class PizzaHut : public PizzaShop
{public:
  virtual string phoneNumber() = 0;
  virtual bool call()
  {
    Phone phone;
    if(!phone.dial(phoneNumber()))
      return false;
    return phone.speak("PizzaHut 嗎?你好,我要點...");
  }
  virtual void deliverPizza()
  {
    PizzaHutEmployee employee;
    employee.knockDoor();
    employee.deliverThePizza();
  }
};

真正存在的分店,會真的做出一個 Pizza ,並且給你真正的電話號碼。它是一間存在的 Pizza 店,你可以在龍江路上找到這家店,你收到的 Pizza 是從台北龍江路上這家店做出來的。

這種實際存在,又處理大部分實作細節的 實體,就叫做 Concrete Class

class PizzaHutBranchNearMyHome : PizzaHut
{public:
  virtual phoneNumber(){
    return "02-2516-2256"; // 龍江店
 }
};

一般設計上不會常用到 Concrete Class ,而都用 InterfaceAbstract Class
就像是你會跟住在外縣市的大學同學說:【幹,我好想吃 Pizza 哦。】而不會說:【幹,我好想吃 PizzaHut 龍江分店 的 Pizza 哦。】一樣。

comments powered by Disqus