2011-08-16 35 views
2

我正在研究一個應用程序,其中包含屬於某個類別的項目,形成一個服務器。我想使下載這個樣子:將項目分類正確

class Downloader 
{ 
    Downloader(const ItemCategoryBase &category); 
    ... 
} 

從ItemCategoryBase派生每個類都將提供它的類ID低谷虛擬功能(其實這是每一個派生類會做的唯一的事情)。

我遇到的問題是,我總共有120個項目類別,併爲每個類別編寫派生類將會很痛苦。

我已經考慮過使用一個原語來保存ID,但是,我不希望實現範圍檢查並在ID超出範圍的情況下拋出異常,這主要是因爲類ID不是同一間隔的所有部分。

我正在尋找的是編寫適合上述方案的代碼的有效方法。

任何幫助,高度讚賞。

回答

1

如果你確定這是做事的正確方法,那麼我會建議編寫一個代碼生成器來處理它:創建一個包含所有類別ID的CSV文檔,然後編寫一個應用程序來插入每個將ID保存到模板頭文件/源文件中,並將其保存出來。(例如,將「$ CATEGORY_ID」放入文件中類別ID的任何位置,然後只需在每個ID上依次替換「$ CATEGORY_ID」。 )

但是,我不確定我是否理解你的陳述:「我已經考慮使用一個原語來保存ID,但是,我不希望實施範圍檢查並在ID超出範圍時拋出異常主要是因爲類別ID不是同一區間的一部分。「我無法想象這樣一種情況,即無需處理應用程序中某處的複雜性,範圍檢查也不會很難:只需將所有有效的類別ID都放入任何ID類型的列表結構中是,並且簡單的索引查找調用可以回答該ID是否是該列表的一部分。

如果我誤解了你,你的設置究竟是什麼使得處理120個ItemCategoryBase派生類比一個ItemCategoryBase基類對ID列表更簡單?你說「主要是因爲類別ID不是同一時間間隔的一部分」,所以也許檢查列表會給你你需要的東西。否則,你能解釋一下它是如何工作的嗎?雖然我意識到總有例外,但120個班級除了提供不同的ID之外別無所求,這實際上讓我覺得這不太可能是一種解決方案,從長遠來看,這些解決方案將爲您提供良好的服務。

1

由於您使用的是C++,爲什麼不使用模板並指定包含該ID的非類型模板參數?

例如,假設類別是一個整數:

template<int category_id> 
class Downloader : public ItemCategoryBase 
{ 
    public: 
    virtual int get_id() 
    { 
     return category_id; 
    } 
}; 

你還不如讓編譯器做的工作適合你。