2016-11-21 80 views
0

假設我有兩類:什麼是模擬進化類的最佳編程習慣?

class SwordsMan{ 
    /*...*/ 
    virtual SwordsMan* evolve() 
}; 

class Warrior: public SwordsMan{ 
    /*...*/ 
}; 

我試圖瞄準的是劍客演變成一個戰士一旦他有足夠的經驗。考慮到我想刪除「this」這個SwordsMan對象一旦發展,最好的做法是實現這個evolve()函數。

+1

完全取決於你想要一個'劍客'演變成'戰士'。順便說一句,我會三思,如果繼承是正確的路要走。也許'勇士'只是一個'劍客'的標題 – user463035818

+0

如果我錯了,請糾正我,但是我在想,因爲戰士有一個正常的劍客沒有的額外能力和屬性(包括劍士的能力),那麼繼承就是要走的路。另外,爲什麼投票呢? – AspiringMat

回答

2

將對象的實現與其生命週期管理分開通常是一個更好的主意。

class SwordsMan { 
    virtual std::unique_ptr<SwordsMan> evolve(); 
}; 

class Warrior: public SwordsMan { }; 

在類的上面一層,代碼看起來是這樣的:

auto swordsMan = std::make_unique<SwordsMan>(); // Get a swordsman 

if(auto evolved = swordsMan->evolve()) // Ask him to evolve 
    swordsMan = std::move(evolved); // Replace him 

如果你只叫evolve()時,你一定要升級的劍客,你可以刪除if

swordsMan = swordsMan->evolve(); 
+0

謝謝,那就是我一直在尋找的!你是否同意這是繼承的可接受的用法?鑑於戰士擁有劍士的所有能力和屬性以及劍士所沒有的其他能力和屬性, – AspiringMat

+1

@ user3508551聽起來不錯:) – Quentin

相關問題