Остановимся лишь на принципиальных моментах реализации класса списков и связанных с ним TInfo и TSelect. Класс TItem и неупомянутые в этом параграфе методы полностью приведены в Приложении.
В TInfo мало интересного, ведь это абстрактный класс. Почему же его метод Print не объявлен как abstract? Ответ ясен из следующих четырех строк.
Класс TRList довольно сложен в реализации, а потому поучителен. Попробуйте разобраться как работает метод Copy. В нем определен указатель на ссылку, и это типичный прием работы со связными списками.
Ещё один нюанс реализации заключается в строке
Здесь не используется оператор as для приведения типа, как это сделано в ряде других случаев. Основанием для такой “смелости” служит то, что Result проинициализирована в предыдущей строке, и дополнительная проверка совместимости типов будет лишней тратой времени.
Метод Insert может служить иллюстрацией к ссылочной семантике эквивалентности.
Эквивалентность в смысле равенства физических адресов устанавливается в цикле
Вторая часть условия проверяет неравнство ссылки before и информационной части текущего пункта списка. Таким образом, если ссылки совпадут, это будет означать, что найден элемент, перед которым следует вставить новый пункт списка.
Кстати, с оператором while связан ещё один тонкий момент — вычисление булевского выражения. В программировании принято два способа вычисления сложных булевских выражений, их можно назвать “полным” и “до результата”. Полная схема вычисления состоит в том, что определяются значения каждого из простых выражений и к ним в порядке приоритета применяются булевские операции. Вторая схема заключается в выполнении вычислений до тех пор пока не окажется возможным установить окончательный результат. Так если в нашем выражении левый операнд окажется равным False, то значение правого не играет роли, окончательный результат будет False. Следовательно, вычисления можно прекратить. Последняя схема принята в языке C. В Pascal разрешены оба варианта вычислений и они определяются опцией компилятора. По умолчанию принято полное вычисление. В Delphi кажется наоборот, полное вычисление логических выражений нужно указывать в опциях компилятора.
В зависимости от принятой схемы вычисления логических выражений наше условие может оказаться правильным или нет. В самом деле, пусть вычисления выполняются полностью, тогда вторая часть будет вычисляться независимо от результатов первой. Если pCur^ равно Nil, то обращение к pCur^.FInfo окажется за пределами памяти нашей программы и возникнет ошибка доступа к памяти.
Пожалуй самым интересным в реализации класса TSelect, является конструктор. Обратите внимание как он избегает создания объекта, если ему передан нулевой указатель. К объекту применяется деструктор, а ссылка Self устанавливается в Nil.
Для правильного применения селекторов разберитесь с методом Next, реализация которого приведена в Приложении.
Опубликовал Kest
August 14 2011 20:56:21 ·
0 Комментариев ·
4882 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.