|
|||||||||||||||||||
|
Статические или виртуальные методыВ общем нужно сделать все методы виртуальными. Используйте статические методы только, когда нужно оптимизировать скорость и эффективность использования памяти. Компромисc, как Вы видите, заключается в расширяемости. Предположим, что Вы объявили объект с именем Ancestor, а внутри объекта Ancestor Вы объявили метод с именем Action. Как определить нужно ли делать Action виртуальным или статическим? Здесь используется правило : Сделаем Action виртуальным, если есть возможность, что некоторые будущие потомки объекта Ancestor будут перекрывать Action и Вы хотите, чтобы будущий код был доступным для Ancestor. Теперь применим это правило к графическим объектам, которые Вы видели в этой главе. В этом случае Point - родительский тип объекта и Вы должны решить делать его методы статическими или виртуальными. Рассмотрим методы Point : Show, Hide и MoveTo. Так как каждый различный тип фигуры имеет свои средства изображения и удаления с экрана, то Show и Hide будут перекрываться любой порожденной фигурой, однако перемещение графической фигуры, по-видимому, будет одинаковым для всех потомков: вызов Hide, чтобы удалить фигуру, изменение координат X и Y, а затем вызов Show, чтобы повторно вывести фигуру на экран в новой позиции. Так как этот алгоритм MoveTo можно применить к любой фигуре с одной точкой отсчета Х,Y, то разумно сделать Point.MoveTo статическим методом, который будет наследоваться всеми потомками Point, но Show и Hide будут перекрываться и должны быть виртуальными так, чтобы Point.MoveTo могла вызвать методы Show и Hide, имеющиеся у потомков Point. С другой стороны, запомним, что если объект имеет какие-нибудь виртуальные методы, то в сегменте данных будет создана таблица виртуальных методов для этого типа объекта и каждый экземпляр объекта будет иметь связь с этой таблицей. Каждый вызов виртуального метода должен передаваться таблице виртуальных методов, в то время как статические методы вызываются непосредственно. Хотя просмотр таблицы виртуальных методов и осуществляется очень эффективно, вызов статического метода происходит несколько быстрее, чем вызов виртуального метода. А если в Вашем объекте нет виртуальных методов, то в сегменте данных таблицы виртуальных методов нет - и что более важно - нет связи с этой таблицей в каждом экземпляре объекта. Дополнительная скорость и эффективность использования памяти у статических методов должна сопоставляться относительно гибкости, которую предоставляют виртуальные методы: расширение существующего кода после компиляции этого кода. Помните, что пользователи Вашего типа объектов могут думать о таких способах использования этого объекта, о которых Вы можете никогда и не предполагать, что в конце концов очень важно. Предыдущая страница | Следующая страница |
|
Web дизайн: Бурлаков Михаил
Web программирование: Бурлаков Михаил