Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
классы_лекция.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
112 Кб
Скачать
☆

Объявление класса

Любой вновь создаваемый класс может содержать секции (разделы), определяемые зарезервированными словами published (опубликованные), private (закрытые), protected (защищенные), public (открытые) и automated (автоматизированные). Внутри каждой секции вначале определяются поля, а затем методы и свойства.

Секции определяют области видимости элементов описания класса. Секция public не накладывает ограничений на область видимости перечисляемых в ней полей, методов и свойств — их можно вызывать в любом другом модуле программы. Секция published также не ограничивает область видимости, однако в ней перечисляются свойства, которые должны быть доступны не только на этапе исполнения, но и на этапе конструирования программы (то есть в окне инспектора объектов). Секция published используется только при разработке нестандартных компонентов. Замечу, что среда Delphi помещает описания компонентов, вставленных в форму, в специальную секцию без названия, которая располагается сразу за заголовком класса и продолжается до первой объявленной секции. Эта секция — published. Программисту не следует помещать в нее собственные элементы описания класса или удалять из нее элементы, вставленные средой. Секция private сужает область видимости до минимума: закрытые элементы описания доступны только внутри методов данного класса и подпрограммах, находящихся в том же модуле, где описан класс. Элемент, объявленный в секции private, становится недоступным даже ближайшим потомкам класса, если они размещаются в других модулях. Секция protected доступна только методам самого класса, а также любым его потомкам, независимо от того, находятся ли они в том же модуле или нет. Наконец, секция automated используется только для объявления свойств и методов, которые будут добавлены к так называемому интерфейсу ОLЕ-объектов автоматизации; область видимости членов этой секции не ограничена.

В Delphi разрешается сколько угодно раз объявлять любую секцию, причем порядок следования секций не имеет значения. Любая секция может быть пустой.

Следующий фрагмент кода поясняет различные области видимости:

Unit Unit1;

Interface

Uses Controls, Forms;

type

TFor1 = class(TForm)

Buttonl: TButton; // Эта секция обслуживается Delphi. Ее элементы доступны всем.

private // Эта секция доступна в модуле Unit1

FlntField: Integer;

Procedure SetValue(Value: Integer);

Function GetValue: Integer;

published // Эта секция доступна в любом модуле

Property IntField: read GetValue write SetValue;

Protected // Эта секция доступна классам-потомкам

Procedure Procl;

Public

Procedure Proc2';

end;

var

Forml: TForml;

Implementation

Procedure TForml.Procl;

begin

Buttonl.Color := clBtnFace; // Так можно

FIntField : = 0; // Так можно

IntField := 0; // Так можно

Procl; // Так можно

Proc2; // Так можно

end;

begin

Forml.Buttonl.Color := clBtnFace; // Так можно

Forml.FlntField := 0; // Так можно

Forml.IntField := 0; // Так можно

Forml.Procl; // Так нельзя

Form1.Proc2; // Так можно

end;

Unit Unit2;

Interface

Uses Controls, Unitl;

type

TForm2 = class(TForm1)

Button2: TButton;

Procedure Button2Click(Sender: TObject);

end;

var

Form2: TForm2;

Implementation

Procedure TForm2.Button2Click(Sender: TObject);

begin

Buttonl.Color := clBtnFace; // Так можно

FIntField : = 0; // Так нельзя

IntField := 0; // Так можно

Procl; // Так можно

Proc2; // Так можно

end;

begin

Forml.Buttonl.Color := clBtnFace; // Так можно

Forml.FlntField := 0; // Так нельзя

Forml.IntField := 0; // Так можно

Forml.Procl; // Так нельзя

Forml.Proc2; // Так можно

end.

При объявлении класса-потомка разрешается перемещать элементы класса из одной области видимости в другую. Для предыдущего примера допустимо такое объявление:

type

TForm2 = class(TForml)

...

Public

procedure Procl;

...

end;

После этого в модуле Unit2 возможно следующее обращение: Form2.Procl;

После перемещения в секцию private элемент объявления становится неви­дим потомкам (если потомок, как это обычно бывает, объявляется в другом моду­ле) и, следовательно, его уже нельзя переместить в другую секцию.

Класс может объявляться только в интерфейсной части модуля или в самом начале области реализации, Нельзя определять классы в разделе описаний подпрограмм.