2016-11-21 5 views
0

Предположим, у меня есть два класса:Какая лучшая практика программирования для моделирования развитого класса?

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

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

То, что я пытаюсь стремиться, что фехтовальщик превращается в воина, как только он имеет достаточный опыт. Что было бы лучшей практикой для реализации этой функции evolve(), учитывая, что я хочу удалить «этот» объект SwordsMan после его развития?

+1

, что полностью зависит от того, как вы хотите, чтобы «Мечник» превратился в «Воина». Кстати, я бы дважды подумал, если наследование - правильный путь. Возможно, «Warrior» - это просто титул, который может иметь «Swordsman». – user463035818

+0

Исправьте меня, если я ошибаюсь, но я думал, что, поскольку у воина есть дополнительные способности и свойства, которых нет у обычного SwordsMan (включая способности фехтовальщика), то наследование было бы правильным. Кроме того, почему голос? – 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

Спасибо, это именно то, что я искал! Согласны ли вы с тем, что это приемлемое использование наследования? Учитывая тот факт, что Воин обладает всеми способностями и свойствами SwordsMan и дополнительными, которых нет у Меченосца? – AspiringMat

+1

@ user3508551 звучит отлично для меня :) – Quentin

Смежные вопросы