pascalabcnet/PABCNetHelp/LangGuide/Classes/constrinheritance.html

76 lines
5.1 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>
&nbsp; A = <b>class<br>
</b>&nbsp;&nbsp;&nbsp; i: integer;<br>
&nbsp;&nbsp;&nbsp; // конструктор по
умолчанию не определен явно, поэтому генерируется автоматически<br>
<b>&nbsp;&nbsp;&nbsp; constructor </b>Create(i: integer);<br>
<b>&nbsp;&nbsp;&nbsp; begin<br>
</b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Self.i := i;<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>
&nbsp; <b>end</b>;<br>
&nbsp; B =<b> class</b>(A)<br>
&nbsp;&nbsp;&nbsp; j: integer;<br>
<b>&nbsp;&nbsp;&nbsp; constructor </b>Create;<br>
<b>&nbsp;&nbsp;&nbsp; begin<br>
</b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // конструктор по умолчанию
базового класса вызывается автоматически<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // конструктор по
умолчанию определен явно, поэтому не генерируется автоматически<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j := 1;<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>
<b>&nbsp;&nbsp;&nbsp; constructor </b>Create(i,j: integer);<br>
<b>&nbsp;&nbsp;&nbsp; begin<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inherited</b> Create(i);<b> <br>
</b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Self.j := j;<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>
<b>&nbsp; end</b>;<br>
&nbsp; C =<b> class</b>(B)<br>
&nbsp; // класс не определяет конструкторов, поэтому<br>
&nbsp; // конструктор по умолчанию и <b>
constructor </b>Create(i,j: integer)&nbsp; &nbsp;<br>
&nbsp; // генерируются автоматически, вызывая в своем
теле соответствующие конструкторы предка<br>
<b>&nbsp; end</b>;<br>
&nbsp;</code></p>
</body>
</html>