- •Структура модуля
- •Interface
- •Implementation
- •Interface
- •Implementation
- •4. Инкапсуляция
- •7. Области видимости
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •10. Функции работы с файлами
- •11. Построение пользовательского интерфейса
- •Interface
- •Implementation
- •С помощью объекта Range выделим диапазон
- •Компонент tDataSource
7. Области видимости
Для определения области видимости в Delphi используются спецификаторы доступа: public, private, protected.
Поля, свойства и методы, находящиеся в секции public, не имеют ограничений на видимость. Они доступны из других функций и методов объектов, как в данном модуле, так и во всех прочих, ссылающихся на него.
Поля, свойства и методы, находящиеся в секции private, доступны только в методах класса и в функциях, содержащихся в том же модуле, что и описываемый класс. Такая директива позволяет скрыть детали внутренней реализации класс от всех.
Поля, свойства и методы, находящиеся в секции protected, доступны для любых объектов внутри данного модуля, а также для объектов классов — наследников данного класса в других модулях. Объекты из других модулей, классы которых не являются наследниками данного класса, защищенных элементов не видят.
Пример:
unit First;
Interface
type
TFirstObj = class;
public
procedure method1;
private
procedure method2;
protected
procedure method3;
end;
procedure proc1;
Implementation
var AFirstObj: TFirstObj;
…
procedure proc1;
begin
AFirstObj:=TFirstObj.Create;
AFirstObj.method1; {можно}
AFirstObj.method2; {можно}
AFirstObj.method3; {Нельзя (Похоже что все-таки можно)}
AFirstObj.Free;
end;
end.
//--------------------------------------------------------------------
unit Second;
Interface
uses First;
type
TSecondObj = class(TFirstObj)
procedure method4;
end;
procedure proc2;
Implementation
var ASecondObj: TSecondObj;
procedure TSecondObj.method4;
begin
method1; {можно}
method2; {Нельзя}
method3; {можно}
end;
procedure proc2;
begin
ASecondObj:= TSecondObj.Create;
ASecondObj.method1; {можно}
ASecondObj.method2; {Нельзя}
ASecondObj.method3; {Нельзя}
ASecondObj.Free;
end;
end.
Элементы, объявленные в разделе interface модуля вне описания типа (класса), видимы и доступны внутри данного модуля и из внешних модулей. В рассмотренном ниже примере это относится к переменной Ch2 и процедуре F3.
Элементы, объявленные в разделе implementation модуля, видимы и доступны внутри данного модуля, но не доступны из внешних модулей. В рассмотренном ниже примере это относится к переменной СhЗ и процедуре F4.
Элементы, объявленные внутри другой процедуры (в рассмотренном примере это переменная Ch4 и процедура F5, описанные внутри процедуры TForml.ButtonlClick), являются локальными, т.е. они видимы и доступны только внутри данной процедуры или внутри процедур, вложенных в данную. При этом время жизни переменных, объявленных внутри процедуры, определяется временем выполнения данной процедуры.
Пример:
unit Unitl;
Interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForml = class(TForm)
Labell: TLabel;
Buttonl: TButton;
procedure ButtonlClick(Sender: TObject);
private
{Процедура Fl доступна только в данном модуле)
procedure Fl (Ch:char) ;
public
{Переменная Chi и процедура F2 доступны для объектов
любых классов и для других модулей, но со ссылкой
на объект}
Chi:char;
procedure F2(Ch:char);
end;
var
Forml: TForml;
{Переменная Ch2 и процедура F3 доступны для объектов
любых классов и для других модулей}
Ch2:char;
procedure F3(Ch:char);