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