Мир программирования

 


Найти: на:


Меню
Партнеры
Счетчики
Реклама

Статические или виртуальные методы


 Предыдущая страница     |     Следующая страница  
Добавить в избанное Обсудить в форуме Написать автору сайта

     В общем нужно сделать все  методы  виртуальными.   Используйте статические методы   только,  когда нужно оптимизировать скорость и эффективность использования памяти.   Компромис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 программирование: Бурлаков Михаил

Используются технологии uCoz