119 lines
7.7 KiB
HTML
119 lines
7.7 KiB
HTML
<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> |