pascalabcnet/PABCNetHelp/LangGuide/Generics/index_generics.html

82 lines
3.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>Îáîáùåííûì òèïîì (generic) íàçûâàåòñÿ
øàáëîí äëÿ ñîçäàíèÿ êëàññà, çàïèñè èëè èíòåðôåéñà, ïàðàìåòðèçîâàííûé îäíèì èëè íåñêîëüêèìè
òèïàìè. Êëàññ (çàïèñü, èíòåðôåéñ) îáðàçóåòñÿ èç øàáëîíà êëàññà&nbsp;(çàïèñè,
èíòåðôåéñà) ïîäñòàíîâêîé
êîíêðåòíûõ òèïîâ â êà÷åñòâå ïàðàìåòðîâ. Ïàðàìåòðû óêàçûâàþòñÿ ïîñëå èìåíè
îáîáùåííîãî òèïà â óãëîâûõ ñêîáêàõ. Íàïðèìåð, <code>Stack&lt;T&gt;</code> -
øàáëîí êëàññà ñïèñêà ýëåìåíòîâ òèïà <code>T</code>,
ïàðàìåòðèçîâàííûé òèïîì <code>T</code>, à <code>
Stack&lt;integer&gt;</code> - êëàññ ñïèñêà ñ ýëåìåíòàìè òèïà
<code>integer</code>.</p>
<p><a href="generic_sub.html">Îáîáù¸ííûå ïîäïðîãðàììû îïèñûâàþòñÿ çäåñü</a>.</p>
<p>Äëÿ îáúÿâëåíèÿ øàáëîíà êëàññà èñïîëüçóåòñÿ ñëåäóþùèé
ñèíòàêñèñ:</p>
<blockquote>
<p><code><b>type</b><br>
&nbsp; Node&lt;T&gt; = <b>class<br>
&nbsp;&nbsp;&nbsp; </b>data: T;<br>
&nbsp;&nbsp;&nbsp; next: Node&lt;T&gt;;<br>
&nbsp; <b>public</b><br>
&nbsp;&nbsp;&nbsp; <b>constructor</b> Create(d: T; nxt: Node&lt;T&gt;);<br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data := d;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next := nxt;<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>
&nbsp; <b>end</b>; <br>
&nbsp; Stack&lt;T&gt; = <b>class<br>
&nbsp;&nbsp;&nbsp; </b>tp: Node&lt;T&gt;; <br>
&nbsp; <b>public<br>
&nbsp;&nbsp;&nbsp; procedure</b> Push(x: T);<br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tp := <b>new</b> Node&lt;T&gt;(x,tp);<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>
&nbsp;&nbsp;&nbsp; <b>function</b> Pop: T;<br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := tp.data;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tp := tp.next;<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>
&nbsp;&nbsp;&nbsp; <b>function</b> Top: T;<br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := tp.data;<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>
&nbsp;&nbsp;&nbsp; <b>function</b> IsEmpty: boolean;<br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := tp = nil;<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>
&nbsp; <b>end</b>;</code></p>
</blockquote>
<p>Èñïîëüçîâàíèå øàáëîíà êëàññà èëëþñòðèðóåòñÿ íèæå:</p>
<blockquote>
<p><code><b>var</b> <br>
&nbsp; si: Stack&lt;integer&gt;;<br>
&nbsp; sr: Stack&lt;real&gt;;<br>
<b>begin</b><br>
&nbsp; si := <b>new</b> Stack&lt;integer&gt;;&nbsp; <br>
&nbsp; sr := <b>new</b> Stack&lt;real&gt;;<br>
&nbsp; <b>for</b> <span lang="en-us"><b>var</b> </span>i := 1 <b>to</b> 10 <b>do</b><br>
&nbsp;&nbsp;&nbsp; si.Push(Random(100));<br>
&nbsp; <b>while</b> <b>not</b> si.IsEmpty <b>do</b><br>
&nbsp;&nbsp;&nbsp; sr.Push(si.Pop);<br>
&nbsp; <b>while</b> <b>not</b> sr.IsEmpty <b>do</b><br>
&nbsp;&nbsp;&nbsp; write(sr.Pop,' ');<br>
<b>end</b>.</code></p>
</blockquote>
<p>Ïîäñòàíîâêà êîíêðåòíîãî òèïà-ïàðàìåòðà â îáîáùåííûé òèï íàçûâàåòñÿ
èíñòàíöèðîâàíèåì.</p>
<p>&nbsp;</p>
</body>
</html>