Видимость членов класса
Каждое поле, метод или свойство класса имеет атрибут видимости. В PascalABC.NET существуют четыре типа атрибутов видимости: public (открытый), private (закрытый), protected (защищенный) и internal (внутренний). К члену класса, имеющему атрибут public, можно обратиться из любого места программы, члены класса с атрибутом private доступны только внутри методов этого класса, члены класса с атрибутом protected доступны внутри методов этого класса и всех его подклассов, члены класса с атрибутом internal доступны внутри сборки (термин.NET, сборка в нашем понимании - это множество файлов, необходимых для генерации.exe или.dll-файла). Кроме того, private и protected члены видны отовсюду в пределах модуля, в котором определен класс.
Тело класса делится на секции. В начале каждой секции располагается атрибут видимости, после которого идут поля, а затем методы и свойства с этим атрибутом видимости. В первой секции атрибут видимости может отсутствовать, в этом случае подразумевается internal. В классе может быть произвольное количество секций, располагающихся в произвольном порядке.
Например, пусть данный код располагается в одном модуле:
type
A = class
private
x: integer;
protected
a: integer;
public
constructor Create(xx: integer);
begin
x:= xx; // верно, т.к. внутри метода класса можно обращаться к его закрытому полю x
a:= 0; // верно
end;
end;
Следующий же код располагается в другом модуле:
type
B = class(A)
public
procedure print;
begin
writeln(a); // верно, т.к. a - защищенное поле
|
|
writeln(x); // неверно, т.к. х - закрытое поле
end;
end;
...
varb1: B:= newB(5);
...
writeln(b1.x); // неверно, т.к. х - закрытое поле
writeln(b1.a); // неверно, т.к. a - защищенное поле
b1.print; // верно, т.к. print - открытый метод
Идиомы Pimpl – указатель на реализацию
Допустим, нам необходимо написать кроссплатформенное сетевое приложение с использованием сокетов. Для этого нам необходим класс GeneralSocket (“Видимый класс”), который будет инкапсулировать в себе детали реализации конкретной платформы (“Скрываемый класс”). Часто требуется скрыть детали реализации от пользователей или других разработчиков:
-Для того, что бы была возможность изменять реализацию скрываемого класса без перекомпиляции остального кода, так как закрытые члены хоть и недоступны извне никому, кроме функций-членов и друзей, но видимы всем, кто имеет доступ к определению класса. Изменение определения класса приводит к необходимости перекомпиляции всех пользователей класса
-Для сокрытия имен из области видимости. Закрытые члены хоть и не могут быть вызваны кодом вне класса, тем не менее они участвуют в поиске имен и разрешении перегрузок
-Для ускорения времени сборки, так как компилятору не нужно обрабатывать лишние определения закрытых типов
Дата добавления: 2015-12-21; просмотров: 22; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!