2018-08-02 22:04:49 +03:00
|
|
|
|
<html>
|
|
|
|
|
|
|
|
|
|
|
|
<head>
|
|
|
|
|
|
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
|
|
|
|
|
</object>
|
|
|
|
|
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
|
|
|
|
|
<title></title>
|
|
|
|
|
|
<link rel="StyleSheet" href="../../default.css">
|
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
|
|
<body>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<H1>Наследование конструкторов</H1>
|
|
|
|
|
|
<p>Правила наследования конструкторов - достаточно сложные. В разных языках
|
|
|
|
|
|
программирования приняты разные решения на этот счет. В частности, в
|
|
|
|
|
|
Delphi Object Pascal все конструкторы наследуются. В
|
|
|
|
|
|
.NET, напротив, конструкторы не наследуются. Причина
|
|
|
|
|
|
такого решения - каждый класс сам должен отвечать за инициализацию своих
|
|
|
|
|
|
экземпляров. Единственное исключение в .NET - если
|
|
|
|
|
|
класс вовсе не определяет конструкторов, то автоматически генерируется
|
|
|
|
|
|
конструктор без параметров, называемый конструктором по умолчанию.</p>
|
|
|
|
|
|
<p>В <b>PascalABC.NET</b> принято промежуточное решение. Если класс не
|
|
|
|
|
|
определяет конструкторов, то все конструкторы предка автоматически генерируются
|
|
|
|
|
|
в потомке, вызывая соответствующие конструкторы предка (можно также говорить,
|
|
|
|
|
|
что они наследуются). Если в классе определяются конструкторы, то конструкторы
|
|
|
|
|
|
предка не генерируются. Конструктор по умолчанию, если он явно не определен,
|
|
|
|
|
|
генерируется автоматически в любом случае <span lang="ru">и является </span>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<code>protected</code><span lang="ru">.</span></p>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Кроме того, в .NET обязательно в конструкторе
|
|
|
|
|
|
потомка первым оператором должен быть вызван конструктор предка; в
|
|
|
|
|
|
Object Pascal это необязательно. Если в <b>
|
|
|
|
|
|
PascalABC.NET</b> конструктор предка вызывается из конструктора потомка, то этот
|
|
|
|
|
|
вызов должен быть первым оператором. Если конструктор предка явно не
|
|
|
|
|
|
вызывается из конструктора потомка, то неявно первым оператором в конструкторе
|
|
|
|
|
|
потомка вызывается конструктор предка по умолчанию (т.е. без параметров). Если
|
|
|
|
|
|
такого конструктора у предка нет (это может быть класс, откомпилированный другим
|
|
|
|
|
|
.NET-компилятором или входящий в стандартную библиотеку
|
|
|
|
|
|
классов - все классы, откомпилированные <b>PascalABC.NET</b>,
|
|
|
|
|
|
имеют конструктор по умолчанию), то возникает ошибка компиляции.</p>
|
|
|
|
|
|
<p>Например:</p>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<p><code><b>type</b> <br>
|
|
|
|
|
|
A = <b>class<br>
|
|
|
|
|
|
</b> i: integer;<br>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
// конструктор по
|
|
|
|
|
|
умолчанию не определен явно, поэтому генерируется автоматически<br>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<b> constructor </b>Create(i: integer);<br>
|
|
|
|
|
|
<b> begin<br>
|
|
|
|
|
|
</b> Self.i := i;<br>
|
|
|
|
|
|
<b>end</b>;<br>
|
|
|
|
|
|
<b>end</b>;<br>
|
|
|
|
|
|
B =<b> class</b>(A)<br>
|
|
|
|
|
|
j: integer;<br>
|
|
|
|
|
|
<b> constructor </b>Create;<br>
|
|
|
|
|
|
<b> begin<br>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
</b> // конструктор по умолчанию
|
|
|
|
|
|
базового класса вызывается автоматически<br>
|
|
|
|
|
|
// конструктор по
|
|
|
|
|
|
умолчанию определен явно, поэтому не генерируется автоматически<br>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
j := 1;<br>
|
|
|
|
|
|
<b>end</b>;<br>
|
|
|
|
|
|
<b> constructor </b>Create(i,j: integer);<br>
|
|
|
|
|
|
<b> begin<br>
|
|
|
|
|
|
inherited</b> Create(i);<b> <br>
|
|
|
|
|
|
</b> Self.j := j;<br>
|
|
|
|
|
|
<b>end</b>;<br>
|
|
|
|
|
|
<b> end</b>;<br>
|
|
|
|
|
|
C =<b> class</b>(B)<br>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
// класс не определяет конструкторов, поэтому<br>
|
|
|
|
|
|
// конструктор по умолчанию и <b>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
constructor </b>Create(i,j: integer) <br>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
// генерируются автоматически, вызывая в своем
|
|
|
|
|
|
теле соответствующие конструкторы предка<br>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<b> end</b>;<br>
|
|
|
|
|
|
</code></p>
|
|
|
|
|
|
</body>
|
|
|
|
|
|
|
|
|
|
|
|
</html>
|