ОБЪЯВЛЕНИЕ КЛАССА
Любой вновь создаваемый класс может содержать секции (разделы), определяемые зарезервированными словами published (опубликованные), private (закрытые), protected (защищенные), public (доступные) и automated (автоматизированные). Внутри каждой секции вначале определяются поля, а затем - методы и свойства. Секции определяют области видимости элементов описания класса. Секция public не накладывает ограничений на область видимости перечисляемых в ней полей, методов и свойств - их можно вызывать в любом другом модуле программы. Секция published также не ограничивает область видимости, однако в ней перечисляются свойства, которые должны быть доступны не только на этапе исполнения, но и на этапе конструирования программы (т. е. в окне Инспектора объектов). Секция published используется только при разработке нестандартных компонентов. Замечу, что среда Delphi помещает описания компонентов, вставленных в форму, в специальную секцию без названия, которая располагается сразу за заголовком класса и продолжается до первой объявленной секции. Эта секция - published. Программисту не следует помещать в нее собственные элементы описания класса или удалять из нее элементы, вставленные средой. Секция private сужает область видимости до минимума: закрытые элементы описания доступны только внутри методов данного класса и подпрограммах, находящихся в том же модуле, где описан класс. Элемент, объявленный в секции private, становится недоступным даже ближайшим потомкам класса, если они размещаются в других модулях. Секция protected доступна только методам самого класса, а также любым его потомкам, независимо от того, находятся ли они в том же модуле или нет. Наконец, секция automated используется только для объявления свойств и методов, которые будут добавлены к так называемому интерфейсу OLE-объектов Автоматизации; область видимости членов этой секции не ограничена. В Object Pascal разрешается сколько угодно раз объявлять любую секцию, причем порядок следования секций не имеет значения. Любая секция может быть пустой. Следующий фрагмент кода поясняет области видимости. Unit Unit1; Interface Uses Controls, Forms; Type TFormI = class (TForm) Buttoni: TButton; // Эта секция обслуживается Delphi // Ее элементы доступны всем private Property IntField: read GetValue write SetValue; protected // Эта секция доступна классам-потомкам Procedure Proc1; public // Эта секция доступна в любом модуле Procedure Proc2; End; Var Formi: TForm1; Implementation Procedure TFormI.Proc1; Buttoni.Color:= clBtnFace;1 // Так можно FIntField:= 0; // Так можно IntField:= 0;1 // Так можно Proc1; // Так можно Proc2;1 // Так можно End; Begin Form1.Button1.Color:= clBtnFace; // Так можно Form1.FIntField:= 0; // Так можно Form1.IntField:= 0; // Так можно End. Unit Unit2; Interface Uses Controls, Unit1; Type TForm2 = class(TFormI) Button2: TButton; Procedure Button2Click(Sender: TObject); End; Var Form2: TForm2; Implementation Procedure TForm2.Button2Click(Sender: TObject); Begin Buttoni.Color:= clBtnFace; // Так можно FIn'tField:= 0; // Так нельзя! IntField:= 0; // Так можно Proc1; // Так можно Proc2; // Так можно End; Begin Form1.Buttoni.Color:= clBtnFace; // Так можно Form1.FIntField:= 0; // Так нельзя! Form1.IntField:= 0; // Так можно Form1.Proc1; //Так нельзя! Form1.Proc2; // Так можно End. При объявлении класса-потомка разрешается перемещать элементы класса из одной области видимости в другую. Для предыдущего примера допустимо такое объявление: Type TForm2 = class(Tform1) Public Procedure Proc1; End; После этого в модуле unit2 возможно такое обращение: Form2.Proc1; После перемещения в секцию private элемент объявления становится невидим потомкам (если потомок, как это обычно бывает, объявляется в другом модуле), и, следовательно, его уже нельзя переместить в другую секцию. Класс может объявляться только в интерфейсной области модуля или в самом начале области реализации. Нельзя определять классы в разделе описаний подпрограмм.
|