|
Оптимизация с применением производящих функций Задержимся на минутку. Допустим, ни один из производных классов Grandpa не интересует публику настолько, чтобы различать их при выборе производящей функции. Даже в этом случае конструирование экземпляров с помощью одной или нескольких производящих функций вполне оправдано. В частности, при этом скрывается логика выбора производного класса, экземпляр которого создается на основании информации, предоставленной на момент создания. Иначе говоря, производящие функции могут послужить средством оптимизации ваших программ. class Number { public: static Number* make(); // Конструирует число по умолчанию static Number* make(int); static Number* make(double); static Number* make(string); // Например, "-1.23" }; // В файле .cpp class Integer : public Number { ... }; class Real : public Number { ... }; class ArbitraryPrecisionNumber : public Number { ... }; Number* Number::make() { return new Integer(0); } Number* Number::make(int x) { return new Integer(x); } Number* Number::make(double x) { return new Real(x); } Number* Number::make(string s) { // Псевдокод if (малое целое) return new Integer(atoi(s)); if (большое целое) return new ArbitraryPrecisionNumber(s); if (вещественное) // И т.д. } Сделать то же с помощью конструкторов не удастся. К тому моменту, когда компилятор начинает искать конструктор с подходящей сигнатурой, вы уже сообщили ему, экземпляр какого класса создается. Более того, такая методика отделяет структуру производных классов от аргументов производящей функции. |
Copyright 2005. Климов Александр. All Right Reserved.