pascalabcnet/PABCNetHelp/LangGuide/Generics/generic_sub.html

105 lines
4.3 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>Îáîáùåííîé ïîäïðîãðàììîé (generic) íàçûâàåòñÿ ïîäïðîãðàììà, ïàðàìåòðèçîâàííàÿ îäíèì èëè íåñêîëüêèìè òèïàìè. Ïîäïðîãðàììà
îáðàçóåòñÿ èç îáîáùåííîé ïîäïðîãðàììû ïîäñòàíîâêîé êîíêðåòíûõ òèïîâ â êà÷åñòâå
ïàðàìåòðîâ. Ïàðàìåòðû óêàçûâàþòñÿ ïîñëå èìåíè ïîäïðîãðàììû â óãëîâûõ ñêîáêàõ.
</p>
<p>Íàïðèìåð, ñëåäóþùàÿ&nbsp; îáîáù¸ííàÿ ôóíêöèÿ ïàðàìåòðèçîâàíà
îäíèì ïàðàìåòðîì:</p>
<blockquote>
<p><code><b>function</b> FindFirstInArray&lt;T&gt;(a: <b>array</b> <b>of</b> T;
val: T): integer;<br>
<b>begin</b><br>
&nbsp; <span lang="en-us">R</span>esult := -1;<br>
&nbsp; <b>for </b><span lang="en-us"><b>var</b> </span>i:=0 <b>to</b> a.Length-1
<b>do</b><br>
&nbsp;&nbsp;&nbsp; <b>if</b> a[i]=val <b>then</b><br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span lang="en-us">R</span>esult := i;<br>
<span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>exit;<br>
<span lang="en-us">&nbsp;&nbsp;&nbsp; </span><b>end</b>;<br>
<b>end</b>;</code></p>
<p><code><b>var</b><span lang="en-us"> </span>x: <b>array</b> <b>of</b>
string;</code></p>
<p><code><b>begin</b><br>
<span lang="en-us">&nbsp; </span>SetLength(x,4);<br>
<span lang="en-us">&nbsp; </span>x[0] := 'Âàíÿ';<br>
<span lang="en-us">&nbsp; </span>x[1] := 'Êîëÿ';<br>
<span lang="en-us">&nbsp; </span>x[2] := 'Ñåðåæà';<br>
<span lang="en-us">&nbsp; </span>x[3] := 'Ñàøà';<br>
<span lang="en-us">&nbsp; </span>writeln(FindFirstInArray(x,'Ñåðåæà'));<br>
<b>end</b>.</code></p>
</blockquote>
<p>Ïðè âûçîâå îáîáùåííîé ïîäïðîãðàììû òèï-ïàðàìåòð îáîáùåíèÿ ìîæíî íå óêàçûâàòü,
ïîñêîëüêó êîìïèëÿòîð <font color="#FF0000"><i><b>âûâîäèò</b></i></font> òèïû
ïàðàìåòðîâ øàáëîíà ïî òèïàì ôàêòè÷åñêèõ ïàðàìåòðîâ.  äàííîì ñëó÷àå ïîñëå
âûâåäåíèÿ ïîëó÷åíî: <code>T=string</code>. </p>
<p>Ïðè âûâåäåíèè òðåáóåòñÿ òî÷íîå ñîîòâåòñòâèå òèïîâ, ïðèâåäåíèå òèïîâ íå
äîïóñêàåòñÿ. Íàïðèìåð, ïðè êîìïèëÿöèè ñëåäóþùåãî êîäà </p>
<blockquote>
<p><code>...<b><br>
var</b> x: <b>array</b> <b>of</b> real;</code></p>
<p><code><b>begin</b><br>
&nbsp; SetLength(x,3);<br>
&nbsp; x[0] := 1;<br>
&nbsp; x[1] := 2.71;<br>
&nbsp; x[2] := 3.14;<br>
&nbsp; writeln(FindFirstInArray(x,1));<br>
<b>end</b>.</code></p>
</blockquote>
<p>ïðîèçîéäåò îøèáêà. Ïðè÷èíà ñîñòîèò â òîì, ÷òî ïåðâûé ïàðàìåòð èìååò òèï
<span lang="en-us">array of real</span>, à âòîðîé - òèï <span lang="en-us">
integer</span>, ÷òî íå ñîîòâåòñòâóåò íè îäíîìó òèïó <span lang="en-us">T </span>
â çàãîëîâêå îáîáùåííîé ôóíêöèè. Äëÿ ðåøåíèÿ ïðîáëåìû ñëåäóåò ëèáî èçìåíèòü òèï
âòîðîãî ïàðàìåòðà íà <span lang="en-us">real</span>:</p>
<blockquote>
<p><code>FindFirstInArray(x,1.0)</code></p>
</blockquote>
<p>ëèáî ÿâíî ïîñëå èìåíè ôóíêöèè â óãëîâûõ ñêîáêàõ óêàçàòü èìÿ òèïà, êîòîðûì
ïàðàìåòðèçîâàí äàííûé âûçîâ:</p>
<blockquote>
<p><code>FindFirstInArray&amp;&lt;real&gt;(x,1)</code></p>
</blockquote>
<p>Èñïîëüçîâàíèå çíàêà <span lang="en-us">&amp; </span>çäåñü îáÿçàòåëüíî, ïîñêîëüêó
â ïðîòèâíîì ñëó÷àå êîìïèëÿòîð òðàêòóåò çíàê <span lang="en-us">&lt; </span>êàê
&quot;ìåíüøå&quot;.</p>
<p>Îáîáù¸ííûìè ìîãóò áûòü íå òîëüêî îáû÷íûå ïîäïðîãðàììû, íî è ìåòîäû êëàññîâ, à
òàêæå ìåòîäû äðóãîãî îáîáù¸ííîãî êëàññà. Íàïðèìåð:</p>
<blockquote>
<p><code><b>type</b><br>
&nbsp; Pair&lt;T,Q&gt; = <b>class</b><br>
&nbsp;&nbsp;&nbsp; first: T;<br>
&nbsp;&nbsp;&nbsp; second: Q;<br>
<b>&nbsp;&nbsp;&nbsp; function</b> ChangeSecond&lt;S&gt;(newval: S): Pair&lt;T, S&gt;;<br>
<b>&nbsp; end</b>;</code></p>
<p><code><b>function</b> Pair&lt;T,Q&gt;.ChangeSecond&lt;S&gt;(newval: S): Pair&lt;T,S&gt;;<br>
<b>begin</b><br>
&nbsp; result := <b>new</b> Pair&lt;T,S&gt;;<br>
&nbsp; result.first := first;<br>
&nbsp; result.second := newval;<br>
<b>end</b>;</code></p>
<p><code><b>var</b><br>
&nbsp; x: Pair&lt;integer,real&gt;;<br>
&nbsp; y: Pair&lt;integer,string&gt;;<b><br>
begin</b><br>
&nbsp; x := <b>new</b> Pair&lt;integer,real&gt;;<br>
&nbsp; x.first := 3;<br>
&nbsp; y := x.ChangeSecond('abc');<br>
&nbsp; writeln(y.first, y.second);<br>
<b>end</b>.</code></p>
</blockquote>
<p>Ïî îêîí÷àíèè ðàáîòû äàííàÿ ïðîãðàììà âûâåäåò 3abc.</p>
</body>
</html>