3.4.9. Возможность получения адреса свойства
3.4.9. Возможность получения адреса свойства
Пусть у нас есть класс, описанный следующим образом (листинг 3.62).
Листинг 3.62. Класс со свойствами, читаемыми из переменной и из функции
TSomeClass = class private
FProp1: Integer;
function GetProp2: Integer;
public
property Prop1: Integer read FProp1;
property Prop2: Integer read GetProp2;
end;
В этом классе два свойства Prop1 и Prop2, значение одного из которых определяется полем FProp1, а другого — функцией GetProp2. Оба свойства предназначены только для чтения, но для того эффекта, о котором здесь пойдет речь, это не принципиально: свойства, значения которых можно менять, ведут себя в этом отношении точно так же.
Пусть X — это переменная типа TSomeClass. Легко убедиться, что компилятор допускает получение адреса свойства Prop1, т. е. конструкция вида @X.Prop1 считается допустимой. Результатом выполнении этого оператора станет указатель на поле FProp1. А вот конструкцию @X.Prop2 компилятор не допускает, выдаёт ошибку Variable required.
Ошибкой компилятора здесь является то, что он допускает получение адреса в первом случае, т. е. для свойства, значение которой берется из переменной. Это грубейшее нарушение принципа инкапсуляции, лежащего в основе объектно-ориентированного программирования, причем сразу по двум причинам. Во-первых, пользователь класса не должен видеть его внутреннюю реализацию, а здесь пользователь может определить, как читается свойство, по возможности применения оператора @ к нему. Во-вторых, пользователь класса должен взаимодействовать с ним строго через предоставленный интерфейс, а у нас получается, что, узнав адрес поля FProp1, пользователь сможет менять его значение в обход предусмотренных для этого в классе механизмов.
К счастью, ситуации, в которых эта недоработка компилятора могла бы принести пользу, крайне редки. Но если вы все-таки столкнулись с такой ситуацией, настоятельно рекомендуем не поддаваться соблазну и искать другие способы решения проблемы. Если класс, к полю которого вы хотите получить доступ таким образом, написан вами, то это веский повод пересмотреть внешний интерфейс класса, т. к. при его проектировании скорее всего, были допущены серьезные ошибки. Если это «чужой» класс, подумайте о том, что в следующей версии этого класса автор может изменить реализация свойства, и тогда ваш код откажется компилироваться.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Способы получения цифрового сертификата
Способы получения цифрового сертификата Различаются цифровые сертификаты трех типов: созданные разработчиком, выданные разработчику организацией и полученные от центра сертификации.Цифровой сертификат, созданный разработчиком, обычно используют те пользователи,
Оператор получения типа typeof
Оператор получения типа typeof Оператор получения типа typeof возвращает строку, описывающую тип данных операнда. Операнд, тип которого нужно узнать, помещают после этого оператора и заключают в круглые скобки:s = typeof("str");В результате выполнения этого выражения в переменной s
Функции протоколов получения почты
Функции протоколов получения почты Как было сказано ранее, при организации почтового сервера необходимо установить сервер передачи почты. Без него использование сервера получения не будет иметь смысла, так как письма, предназначенные для доставки пользователям,
Настройка sendmail для получения почты
Настройка sendmail для получения почты Когда удаленный сервер передает почту вашему серверу, письма адресованы конкретным пользователям, работающим на определенных компьютерах. Чтобы обеспечить доставку локальной почты, программа sendmail должна распознавать локальные
Настройка Postfix для получения почты
Настройка Postfix для получения почты Подобно другим почтовым серверам, Postfix считает локальными только адреса некоторых узлов. Чтобы определить, какой из компьютеров является локальным, Postfix использует опцию mydestination. По умолчанию для данной опции приняты значения $myhostname и
Оператор получения типа typeof
Оператор получения типа typeof Оператор получения типа typeof возвращает строку, описывающую тип данных операнда. Операнд, тип которого нужно узнать, помещают после этого оператора и заключают в круглые скобки:s = typeof("str");В результате выполнения этого выражения в переменной s
B.1 Возможность получения документов RFC
B.1 Возможность получения документов RFC На момент выхода книги документы RFC можно было получить в службе каталогов и баз данных InterNIC (InterNIC Directory and Database Services), обслуживаемой компанией AT&T. Эта служба доступна по адресу:http://www.internic.net/при выборе DIRECTORY AND DATABASE SERVICES и перехода по
Скорость получения отклика
Скорость получения отклика Скорость коммуникации через Интернет очень высока. Мы получаем ответ на электронное письмо уже через несколько минут (если, конечно, повезет) после того, как написали свое, – быстрее только телефон и беседа, однако на телефонные разговоры и на
8.1.24. Инвертирование массива для получения хэша
8.1.24. Инвертирование массива для получения хэша Массив нужен для того, чтобы ассоциировать целое число (индекс) с данными. А если нужно инвертировать это отношение, то есть ассоциировать данные с индексом? Иными словами, породить хэш? Это можно сделать так:class Array def invert h={}
II. ОПЕРАЦИЯ КОСВЕННОГО ПОЛУЧЕНИЯ ЭЛЕМЕНТА: ->
II. ОПЕРАЦИЯ КОСВЕННОГО ПОЛУЧЕНИЯ ЭЛЕМЕНТА: -> Эта операция используется с указателем на структуру или объединение для определения элемента структуры или объединения. Предположим, что ptrstr является указателем на структуру и что member элемент, определенный
Глава 3. Способы получения изображений
Глава 3. Способы получения изображений Прежде чем начать работу над фотографией, вам необходимо получить исходный материал — изображение в цифровом виде. Существует множество способов получения таких изображений. В этой главе мы рассмотрим наиболее распространенные и
15.7. Настройка приложения для получения пуш-уведомлений
15.7. Настройка приложения для получения пуш-уведомлений Постановка задачи Требуется сконфигурировать приложение таким образом, чтобы сервер мог по своей инициативе отправлять уведомления на различные
9. Косвенные модели получения продажной стоимости
9. Косвенные модели получения продажной стоимости Однако, есть способы образования рынков, связанных с услугами в области программного обеспечения, которые представляют собой нечто, подобное получению косвенным образом продажной цены. Есть пять существующих и две