[問題] 多型的問題
假設我有一個食物的interface,如下:
interface IFood
{
virtual void Create() = 0;
virtual char* GetName() = 0;
virtual int GetPrice() = 0;
};
食物可以被創造,然後取得食物的名字和價格
繼承此interface的class如下:
class CBeef : public IFood
{ ... };
class CLamb : public IFood
{ ... };
class CChicken : public IFood
{ ... };
於是我可以使用多型的好處:
IFood *pFood = NULL;
switch(yourOrder)
{
case ORDER_BEEF:
pFood = new Beef();
break;
case ORDER_LAMB:
pFood = new CLamb();
break;
case ORDER_CHICKEN:
pFood = new CChicken()
break;
};
pFood->Create();
cout << "Name: " << pFood->GetName() << endl;
cout << "Price: " << pFood->GetPrice() << endl;
...
pFood->GetName()和pFood->GetPrice()會根據傳入的yourOrder變數而有所改變
但是當我加入了另一種食物,比方說
interface IDrink : IFood
{
virtual void CreateDrink(int nIce) = 0;
};
飲料也是食物的一種,也需要取得價格和名字,所以繼承自IFood
但不同的是創造飲料需要冰塊,所以我沒辦法用原本IFood::Create()來創造飲料
繼承飲料的class如下:
class CCoke : public IDrink()
{
public:
void CreateDrink(int nIce) {...}
void Create() { //do nothing }
char* GetName() { ... }
int GetPrice() { ... }
};
class CTea : public IDrink()
{
public:
void CreateDrink(int nIce) {...}
void Create() { //do nothing }
char* GetName() { ... }
int GetPrice() { ... }
};
因為還是要實作IFood的純虛擬函數,所以只好在Create()內甚麼事也不作
這樣感覺就有點累贅,繼承了一個我不需要的method
而且在使用上也沒有之前那麼俐落了,我還必須判斷目前pFood指向的是飲料還食物
若是一般的食物我就使用pFood->Create();
若是飲料我就必須把pFood轉型成IDrink,然後使用CreateDrink();
該怎麼改code,讓程式比較簡潔呢??
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.240.139.207
推
03/10 00:03, , 1F
03/10 00:03, 1F
→
03/10 00:03, , 2F
03/10 00:03, 2F
→
03/10 00:24, , 3F
03/10 00:24, 3F
→
03/10 00:27, , 4F
03/10 00:27, 4F
→
03/10 00:28, , 5F
03/10 00:28, 5F
→
03/10 00:32, , 6F
03/10 00:32, 6F
→
03/10 00:33, , 7F
03/10 00:33, 7F
→
03/10 00:40, , 8F
03/10 00:40, 8F
→
03/10 00:41, , 9F
03/10 00:41, 9F
→
03/10 00:44, , 10F
03/10 00:44, 10F
推
03/10 00:45, , 11F
03/10 00:45, 11F
→
03/10 00:46, , 12F
03/10 00:46, 12F
→
03/10 00:46, , 13F
03/10 00:46, 13F
→
03/10 00:47, , 14F
03/10 00:47, 14F
→
03/10 00:47, , 15F
03/10 00:47, 15F
→
03/10 00:48, , 16F
03/10 00:48, 16F
→
03/10 00:49, , 17F
03/10 00:49, 17F
→
03/10 00:50, , 18F
03/10 00:50, 18F
→
03/10 00:59, , 19F
03/10 00:59, 19F
→
03/10 01:01, , 20F
03/10 01:01, 20F
→
03/10 01:02, , 21F
03/10 01:02, 21F
→
03/10 01:09, , 22F
03/10 01:09, 22F
→
03/10 01:10, , 23F
03/10 01:10, 23F
→
03/10 01:11, , 24F
03/10 01:11, 24F
推
03/10 04:00, , 25F
03/10 04:00, 25F
→
03/10 04:01, , 26F
03/10 04:01, 26F
→
03/10 04:02, , 27F
03/10 04:02, 27F
→
03/10 04:02, , 28F
03/10 04:02, 28F
→
03/10 04:03, , 29F
03/10 04:03, 29F
→
03/10 04:04, , 30F
03/10 04:04, 30F
→
03/10 04:05, , 31F
03/10 04:05, 31F
→
03/10 04:06, , 32F
03/10 04:06, 32F
→
03/10 04:07, , 33F
03/10 04:07, 33F
→
03/10 04:07, , 34F
03/10 04:07, 34F
→
03/10 04:08, , 35F
03/10 04:08, 35F
→
03/10 10:42, , 36F
03/10 10:42, 36F
→
03/11 23:52, , 37F
03/11 23:52, 37F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章