76 lines
5.1 KiB
HTML
76 lines
5.1 KiB
HTML
<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>
|
||
<H1>Наследование конструкторов</H1>
|
||
<p>Правила наследования конструкторов - достаточно сложные. В разных языках
|
||
программирования приняты разные решения на этот счет. В частности, в
|
||
Delphi Object Pascal все конструкторы наследуются. В
|
||
.NET, напротив, конструкторы не наследуются. Причина
|
||
такого решения - каждый класс сам должен отвечать за инициализацию своих
|
||
экземпляров. Единственное исключение в .NET - если
|
||
класс вовсе не определяет конструкторов, то автоматически генерируется
|
||
конструктор без параметров, называемый конструктором по умолчанию.</p>
|
||
<p>В <b>PascalABC.NET</b> принято промежуточное решение. Если класс не
|
||
определяет конструкторов, то все конструкторы предка автоматически генерируются
|
||
в потомке, вызывая соответствующие конструкторы предка (можно также говорить,
|
||
что они наследуются). Если в классе определяются конструкторы, то конструкторы
|
||
предка не генерируются. Конструктор по умолчанию, если он явно не определен,
|
||
генерируется автоматически в любом случае <span lang="ru">и является </span>
|
||
<code>protected</code><span lang="ru">.</span></p>
|
||
<p>Кроме того, в .NET обязательно в конструкторе
|
||
потомка первым оператором должен быть вызван конструктор предка; в
|
||
Object Pascal это необязательно. Если в <b>
|
||
PascalABC.NET</b> конструктор предка вызывается из конструктора потомка, то этот
|
||
вызов должен быть первым оператором. Если конструктор предка явно не
|
||
вызывается из конструктора потомка, то неявно первым оператором в конструкторе
|
||
потомка вызывается конструктор предка по умолчанию (т.е. без параметров). Если
|
||
такого конструктора у предка нет (это может быть класс, откомпилированный другим
|
||
.NET-компилятором или входящий в стандартную библиотеку
|
||
классов - все классы, откомпилированные <b>PascalABC.NET</b>,
|
||
имеют конструктор по умолчанию), то возникает ошибка компиляции.</p>
|
||
<p>Например:</p>
|
||
<p><code><b>type</b> <br>
|
||
A = <b>class<br>
|
||
</b> i: integer;<br>
|
||
// конструктор по
|
||
умолчанию не определен явно, поэтому генерируется автоматически<br>
|
||
<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>
|
||
</b> // конструктор по умолчанию
|
||
базового класса вызывается автоматически<br>
|
||
// конструктор по
|
||
умолчанию определен явно, поэтому не генерируется автоматически<br>
|
||
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>
|
||
// класс не определяет конструкторов, поэтому<br>
|
||
// конструктор по умолчанию и <b>
|
||
constructor </b>Create(i,j: integer) <br>
|
||
// генерируются автоматически, вызывая в своем
|
||
теле соответствующие конструкторы предка<br>
|
||
<b> end</b>;<br>
|
||
</code></p>
|
||
</body>
|
||
|
||
</html> |