Наверняка, в предыдущих уроках вы задавались вопросом: что же обозначает ключевое слово public в описании класса? Именно об этом мы сейчас и поговорим.
Но сначала мы вернемся к истокам объекто-ориентированного программирования, а вернее к тем парадигмам, которые лежат в основе ООП. Одной из наиболее важных целей ООП является возможность отделить внутреннюю реализацию класса от внешнего использования и реализовывать класс так, чтобы он выполнял только строго задуманную задачу. При этом необходимо отделить реализацию задуманной задачи в классе от возможностей внешнего использования этого класса. Такой подход называется инкапсуляцией. Это такой механизм ООП, который позволяет ограничить доступ к составляющим класса (методам и полям. И необходимо его использовать для того, чтобы, к примеру, ограничить внешний доступ к каким-либо составляющим класса, которые обеспечивают внутреннюю реализацию самого класса. Т.е. те методы и поля, которые использовать извне не рекомендуется, которые служат для внутреннего функционирования, работы класса, будет грамотнее сделать недоступными для обращения из внешнего кода класса. Внешним кодом для класса в данном случае мы называем код, который не является реализацией данного класса. Ранее мы видели подобную конструкцию:
1
2
3
4
5
6
7
|
TTeacher = class
public
FullName: string;
constructor Create(NewFullName: string);
destructor Destroy;
end;
|
Public
Ключевое слово public указывает на то, что последующие поля и методы будут доступны во внешнем коде у данного класса. Т.е. все, что следует после public будет доступно отовсюду при обращении к экземпляру данного класса.
В классе можно объявить несколько модификаторов доступа. Например, добавим модификатор доступа private:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
TTeacher = class
private
BaseId: integer; // Предположим, что это какой-либо идентификатор в базе данных, где хранятся данные об этом преподавателе.
procedure SaveToBase; // А это внутренний метод, который вероятно предназначен для записи обновленных данных в БД.
public
FullName: string;
...
constructor Create(NewFullName: string);
destructor Destroy;
end;
|
Как вы видите, я описал одно поле и один метод, которые явно должны быть скрыты от внешнего использования, которые наверняка будут использоваться только внутри реализации самого класса. Именно поэтому мы будем использовать модификатор доступа private.
Private
Private позволяет полностью ограничить доступ к ниже перечисленным полям и методам. При попытке к ним обратиться из внешнего кода они будут невидимы, попытки к ним обратиться будут запрещаться ошибкой компиляции.
[warning]Существует единственное ограничение для private — все поля и методы, находящиеся в этой группе доступа, будут в любом случае видимы внутри текущего юнита, в котором описан и реализован класс. Ограничение НЕ работает в юните, в котором описан и реализован класс, оно распространяется лишь на другие юниты.[/warning]
[tip]Одной из задач ООП является организация командной работы над проектом. Если какое-то поле или какой-то метод был вынесен в приватную группу доступа класса, то значит разработчик этого класса не рекомендует обращаться к этим полям и методам из внешнего кода, он просто ограничивает к ним доступ. В публичную группу доступа рекомендуется выносить только те поля и методы, которые предназначены для обращения к ним извне, для работы с классом из внешнего кода.[/tip]
Иногда возникает потребность в том, чтобы ограничить использование какого-либо метода или поля и во внешнем коде текущего юнита (в котором описан и реализован данный класс) тоже. Для этого существует группа доступа strict private.
Strict private
Strict private — группа доступа, которая появилась в Delphi относительно недавно. Она позволяет, как уже было сказано, ограничить доступ к определенным полям и методам и в юните, в котором реализован и описан данный класс, в отличие от группы доступа private. Т.е. эта группа доступа действительно запрещает использование во всем внешнем коде, в том числе и в данном юните. Таким образом, ранее приведенный пример описания класса может выглядеть так:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
TTeacher = class
strict private
BaseId: integer; // Предположим, что это какой-либо идентификатор в базе данных, где хранятся данные об этом преподавателе.
procedure SaveToBase; // А это внутренний метод, который вероятно предназначен для записи обновленных данных в БД.
public
FullName: string;
...
constructor Create(NewFullName: string);
destructor Destroy;
end;
|
Итак, в этом уроке мы разобрали три группы доступа: private, strict private и public. И, конечно же, рассмотрели различия между ними. В следующем уроке мы рассмотрим принципы наследования классов — это тоже одна из наиболее важных парадигм. И при ее рассмотрении у нас появится еще одна группа доступа protected, но это уже совсем другая история…
|