pascalabcnet/PABCNetHelp/LangGuide/Classes/constrinheritance.html

76 lines
5.1 KiB
HTML
Raw Permalink Normal View History

<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>