我有一個問題,讓我覺得很蠢。在一個業餘愛好項目中,我有一個std ::指向接口類的指針列表,指向接口的各種具體實現。沒有RTTI的計數對象
例如,說我有以下幾點:
class Seafood ...
class Fishstick : public Seafood ...
class Squid : public Seafood ...
...
std::list<Seafood*> buffet;
現在,我有我的自助不同的海鮮物品填充,我想指望我有可供看是否更需要fishsticks數量從廚房訂購。
我該如何做到這一點沒有RTTI或一些不正當的實施?我讀過一些文章,聲稱如果你發現自己想要使用RTTI,你會以錯誤的方式接近OOP,或者你的解決方案應該重新設計。有沒有解決這個問題的模式或其他解決方案?我相信我以前必須多次出現。我想到了這是一種明顯的虛擬功能,但我無法弄清楚如何在沒有構建RTTI的俗套版本或關於後代進入界面的某些知識(CountIfFishstick/IsFishstick /是(種))。
編輯:想到的另一件事是保留一份魚餌列表,一份魷魚列表等,但這肯定會打敗接口/實現的整個目的。
正如你所說,這裏有一個小小的代碼味道:要麼你關心特定類型(你似乎)或者你不關心(使用界面)。請注意,多態不是能夠將它們一起存儲在容器中,而是能夠通過固定接口(例如調用函數時)使用派生類型,因此您可能希望將它們分開(用於計算目的)和但使用界面或其他目的。 –
如果你絕對必須檢查變量的類型以確定它的性質,'bool isFishstick = !! dynamic_cast(value);'應該工作。也就是說,你應該尋找其他解決這個問題的方法。 –
實際上,所有人都害怕RTTI等,這實際上很愚蠢。氣味並不表示不好的設計,這表明可能是壞的設計。雖然多態性是關於對待事物是相同的,但有時候這是必要的,比如在計算具體類型時,要挖掘繼承層次。這樣做而不是其他一些令人費解的事情是最簡單和最好的方法。 –