Под инкапсуляцией понимается
скрытие полей объекта с целью обеспечения доступа к ним только посредством методов
класса.
В языке Delphi ограничение
доступа к полям объекта реализуется при помощи свойств объекта. Свойство объекта
характеризуется полем, сохраняющим значение свойства, и двумя методами, обеспечивающими
доступ к полю свойства. Метод установки значения свойства называется методом
записи свойства (write), а метод получения значения свойства — методом чтения
свойства (read).
В описании класса перед
именем свойства записывают слово property (свойство). После имени свойства указывается
его тип, затем — имена методов, обеспечивающих доступ к значению свойства. После
слова read указывается имя
метода, обеспечивающего чтение свойства, после слова write — имя метода, отвечающего
за запись свойства.
Ниже приведен пример
описания класса TPerson, содержащего два свойства: Name И Address.
type
TName
= string[15]; TAddress = string[35];
TPerson = class // класс
private
FName:
TName; // значение свойства Name
FAddress: TAddress; // значение свойства Address
Constructor Create(Name:Tname);
Procedure Show;
Function GetName: TName;
Function GetAddress: TAddress;
Procedure SetAddress(NewAddress:TAddress);
public
Property
Name: Tname // свойство Name
read GetName; // доступно только для чтения
Property
Address: TAddress // свойство Address
read GetAddress // доступно для чтения
write SetAddress; // и записи
end;
В программе для установки
значения свойства не нужно записывать инструкцию применения к объекту метода
установки значения свойства, а надо записать обычную инструкцию присваивания
значения свойству. Например, чтобы присвоить значение свойству Address объекта
student, достаточно записать
student.Address := 'С.Петербург,
ул.Садовая
21, кв.3';
Компилятор перетранслирует
приведенную инструкцию присваивания значения свойству в инструкцию вызова метода
student.SetAddress('С.Петербург,
ул.Садовая
21, кв.3');
Внешне применение свойств
в программе ничем не отличается от использования полей объекта. Однако между
свойством и полем объекта существует принципиальное отличие: при присвоении
и чтении значения свойства автоматически вызывается процедура, которая выполняет
некоторую работу.
В программе на методы
свойства можно возложить некоторые дополнительные задачи. Например, с помощью
метода можно проверить корректность присваиваемых свойству значений, установить
значения других полей, логически связанных со свойством, вызвать вспомогательную
процедуру.
Оформление данных объекта
как свойства позволяет ограничить доступ к полям, хранящим значения свойств
объекта: например, можно разрешить только чтение. Для того чтобы инструкции
программы не могли изменить значение свойства, в описании свойства надо указать
лишь имя метода чтения. Попытка присвоить значение свойству, предназначенному
только для чтения, вызывает ошибку времени компиляции. В приведенном выше описании
класса TPerson свойство Name доступно только для чтения, а свойство Address
— для чтения и записи.
Установить значение
свойства, защищенного от записи, можно во время инициализации объекта. Ниже
приведены методы класса TPerson, обеспечивающие создание объекта класса TPerson
и доступ к его свойствам.
// конструктор объекта TPerson
Constructor TPerson.Create(Name:TName);
begin
FName:=Name;
end;
//
метод получения значения свойства Name
Function
TPerson.GetName;
begin
Result:=FName;
end;
//
метод получения значения свойства Address
function
TPerson.GetAddress;
begin
Result:=FAddress;
end;
// метод изменения значения свойства Address
Procedure TPerson.SetAddress(NewAddress:TAddress);
begin
if
FAddress =' '
then FAddress := NewAddress;
end;
Приведенный конструктор
объекта TPerson создает объект и устанавливает значение поля FName, определяющего
значение свойства Name.
Инструкции программы,
обеспечивающие создание объекта класса трегзоп и установку его свойства, могут
быть, например, такими:
student := TPerson.Create('Иванов');
student.Address := 'ул. Садовая, д.3, кв.25';
Когда тот или иной физик использует понятие "физический вакуум", он либо не понимает абсурдности этого термина, либо лукавит, являясь скрытым или явным приверженцем релятивистской идеологии.
Понять абсурдность этого понятия легче всего обратившись к истокам его возникновения. Рождено оно было Полем Дираком в 1930-х, когда стало ясно, что отрицание эфира в чистом виде, как это делал великий математик, но посредственный физик Анри Пуанкаре, уже нельзя. Слишком много фактов противоречит этому.
Для защиты релятивизма Поль Дирак ввел афизическое и алогичное понятие отрицательной энергии, а затем и существование "моря" двух компенсирующих друг друга энергий в вакууме - положительной и отрицательной, а также "моря" компенсирующих друг друга частиц - виртуальных (то есть кажущихся) электронов и позитронов в вакууме.
Однако такая постановка является внутренне противоречивой (виртуальные частицы ненаблюдаемы и их по произволу можно считать в одном случае отсутствующими, а в другом - присутствующими) и противоречащей релятивизму (то есть отрицанию эфира, так как при наличии таких частиц в вакууме релятивизм уже просто невозможен). Подробнее читайте в FAQ по эфирной физике.