/
n-dimens
/
pascalabcnet
Обзор
Документация
Войти
/
n-dimens
/
pascalabcnet
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
PABCNetHelp/LangGuide/Classes/classconstr.html
119 строк
8 KB
samuraiGH
adding working-tree-encoding attribute (#3325)
07 ноя 2025, 16:12
Не верифицирован
07 ноя 2025, 16:12
cf1fd29
Код
Авторство
О чём код?
<html> <head> <object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e"> <param name="Keyword" value="static"> <param name="Keyword" value="статический"> </object> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <title></title> <link rel="StyleSheet" href="../../default.css"> </head> <body> <H1>Статические классы, поля, методы, свойства и конструкторы</H1> <p>В классе можно объявить так называемые <i>статические</i> поля, свойства и методы. Они не принадлежат конкретному экземпляру класса, а связаны с классом. Для их вызова используется точечная нотация, причем, перед точкой используется не имя объекта, а имя класса. Чтобы поле или свойство или метод сделать статическим, перед его именем следует указать ключевое слово <code> <b>static</b></code>. При описании статических свойств в секциях read и write можно указывать только статические поля или методы.</p> <p>Например, определим для класса <span lang="en-us">Person </span>количество созданных объектов этого класса как статическое поле и организуем доступ к этому полю на чтение с помощью статической функции<span lang="en-us">. </span>После каждого вызова конструктора значение статического поля будет увеличиваться на 1:</p> <p><code><b>type</b> <br> Person = <b>class</b><br> <b>private</b><br> name: string;<br> age: integer;<br> <b>static</b><span lang="en-us"> cnt: integer := 0;<br></span> <b>public<br> static<span lang="en-us"> property</span></b><span lang="en-us"> Coun: integer <b>read</b> cnt;</span><br> <b>constructor</b> (n: string; a: integer);<br> <b>begin<br> </b><span lang="en-us"> cnt += 1; </span><br> name := n;<br> age := a;<br> <b>end</b>;<br> <span lang="en-us"> <b>static function</b> Count: integer;<br> <b>begin</b><br> Result := cnt;<br> <b>end</b>;</span><br> <span lang="en-us"><b>end</b>;</span></code></p> <p><code><span lang="en-us"><b>begin</b><br> <b>var</b> p: Person := new Person('</span>Иванов<span lang="en-us">',20);<br> <b>var</b> p1: Person := new Person('</span>Петров<span lang="en-us">',18);<br> Writeln(Person.Count); // </span>обращение к классовому методу <span lang="en-us">Count<br> <b>end</b>.</span></code></p> <p>В отличие от статических полей и методов, обычные поля и методы называются экземплярными. Из обычных методов можно обращаться к экземплярным и статическим полям, но из статических методов можно обращаться только к статическим полям.</p> <p>Аналогично можно определить также статический конструктор, предназначенный для автоматической инициализации классовых полей. Статический конструктор<span lang="ru"> описывается с ключевым словом <code> <b>static</b></code> и гарантированно вызывается перед вызовом любого статического метода и созданием первого объекта этого класса.</span></p> <p>Например, определим в классе <code>Person</code><span lang="en-us"> статическое</span> поле - массив объектов типа <code>Person</code> - и инициализируем его в статическом конструкторе. Потом указанный массив можно использовать в реализации статической функции <code>RandomPerson</code>, возвращающей случайный объект типа <code>Person</code><span lang="en-us">:</span><span lang="ru"> </span></p> <blockquote> <p><code><b>type</b> <br> Person = <b>class</b><br> <b>private</b><br> <b>static</b> arr: <b>array</b> <b>of</b> Person; <br> name: string;<br> age: integer;<br> <b>public</b><br> <b>static</b> constructor; <br> <b>begin</b><br> SetLength(arr,3);<br> arr[0] := <b>new</b> Person('Иванов',20);<br> arr[1] := <b>new</b> Person('Петрова',19);<br> arr[2] := <b>new</b> Person('Попов',35);<br> <b>end</b>;<br> <span lang="en-us"> //...</span><br> <b>static</b> <b>function</b> RandomPerson: Person; <br> <b>begin</b><br> Result := arr[Random(3)];<br> <b>end</b>;<br> <b>end</b>;<br> <span lang="en-us"><b>const</b> cnt = 10;</span><b><br> begin<br> </b><span lang="en-us"> <b>var</b> a := <b>new</b> Person[cnt];<br> <b>for var</b> i:=0 </span><b>to</b><span lang="en-us"> a.Length-1 </span> <b>do</b><span lang="en-us"><br> a[i] := Person.RandomPerson;<br> </span><b>end</b><span lang="en-us">.</span></code></p> </blockquote> <p>Класс также можно описывать как статический:</p> <blockquote> <p><code><b>type</b> <br> MyStatic = <b>static class<br> static</b> Pi<b>:</b> real := 3.14;<b><br> static</b> <strong>function</strong> Pi2 := Pi * Pi;<b><br> end;</b></code></p> </blockquote> <p>В этом случает все его методы, поля, свойства и конструкторы должны быть статическими. Запрещается создавать экземпляры статических классов. Кроме того, от статических классов нельзя наследовать, статический класс не может быть предком и статическим классом нельзя инстанцировать обобщенный класс.</p> <p>Для совместимости с Delphi статические члены класса можно также объявлять с ключевым словом <code> <span lang="ru"> <b>c</b></span><b>lass</b></code>, которое в этом контексте является синонимом <span lang="ru"> <code> <b>static</b></code></span>:</p> <blockquote> <p><code><b>type</b> <br> MyStatic = <b>static class<br> </b><strong>class</strong> Pi<b>:</b> real := 3.14;<b><br> </b><strong>class</strong> <strong>function</strong> Pi2 := Pi * Pi;<b><br> end;</b></code></p> </blockquote> <p> </p> </body> </html>