什么是模拟进化类的最佳编程习惯?

问题描述:

假设我有两类:什么是模拟进化类的最佳编程习惯?

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

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

我试图瞄准的是剑客演变成一个战士一旦他有足够的经验。考虑到我想删除“this”这个SwordsMan对象一旦发展,最好的做法是实现这个evolve()函数。

+1

完全取决于你想要一个'剑客'演变成'战士'。顺便说一句,我会三思,如果继承是正确的路要走。也许'勇士'只是一个'剑客'的标题 – user463035818

+0

如果我错了,请纠正我,但是我在想,因为战士有一个正常的剑客没有的额外能力和属性(包括剑士的能力),那么继承就是要走的路。另外,为什么投票呢? – AspiringMat

将对象的实现与其生命周期管理分开通常是一个更好的主意。

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