В настоящее время я беседую с моим учителем о дизайне классов, и мы подошли к Initialize()
функциям, которые он активно продвигает. Пример:
class Foo{
public:
Foo()
{ // acquire light-weight resources only / default initialize
}
virtual void Initialize()
{ // do allocation, acquire heavy-weight resources, load data from disk
}
// optionally provide a Destroy() function
// virtual void Destroy(){ /*...*/ }
};
Все с необязательными параметрами, конечно.
Теперь он также делает упор на расширяемость и использование в иерархиях классов (он разработчик игр и его компания продает игровой движок) со следующими аргументами (взято дословно, только переведено):
Аргументы против конструкторов:
- не может быть переопределен производными классами
- не может вызывать виртуальные функции
Аргументы для функций Initialize()
:
- производный класс может полностью заменить код инициализации
- производный класс может инициализировать базовый класс в любое время во время его собственной инициализации
Мне всегда учили выполнять настоящую инициализацию непосредственно в конструкторе и не предоставлять такие функции Initialize()
. Тем не менее, я уверен, что у меня не так много опыта, как он делает, когда дело доходит до развертывания библиотеки/движка, поэтому я подумал, что спрошу у хорошего "SO".
Итак, что же такое аргументы для таких функций Initialize()
и против них? Это зависит от среды, где она должна использоваться? Если да, просьба указать аргументы для разработчиков библиотеки/движка или, если можно, даже разработчика игр в целом.
Изменить. Я должен был упомянуть, что такие классы будут использоваться как переменные-члены только в других классах, поскольку для них ничего не будет иметь смысла. К сожалению.