pascalabcnet/PABCNetHelp/LangGuide/Classes/operoverloading.html
Mikhalkovich Stanislav 71bf09add9 bug fix #1632
правки в Help
2019-01-26 11:43:27 +03:00

98 lines
5.4 KiB
HTML

<html>
<head>
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
<param name="Keyword" value="operator">
<param name="Keyword" value="implicit">
<param name="Keyword" value="explicit">
<param name="Keyword" value="Ïåðåãðóçêà îïåðàöèé">
</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>Ïåðåãðóçêà îïåðàöèé - ýòî ñðåäñòâî ÿçûêà, ïîçâîëÿþùåå ââîäèòü
îïåðàöèè íàä òèïàìè, îïðåäåëÿåìûìè ïîëüçîâàòåëåì. Â <b>PascalABC.NET</b>
ìîæíî èñïîëüçîâàòü òîëüêî ïðåäîïðåäåëåííûå çíà÷êè îïåðàöèé.
Ïåðåãðóçêà îïåðàöèé äëÿ òèïà <code>T</code>, ÿâëÿþùåãîñÿ
êëàññîì èëè çàïèñüþ, îñóùåñòâëÿåòñÿ ïðè ïîìîùè ñòàòè÷åñêîé (êëàññîâîé) ôóíêöèè-ìåòîäà ñî
ñïåöèàëüíûì èìåíåì <b><code>operator</code></b> <i>
ÇíàêÎïåðàöèè</i>. Ïåðåãðóçêà ñïåöèàëüíûõ îïåðàöèé <code>+=</code>, <code>
-=</code>, <code>*=</code>, <code>/=</code>
îñóùåñòâëÿåòñÿ ñ ïîìîùüþ ñòàòè÷åñêîé ïðîöåäóðû-ìåòîäà, ïåðâûé ïàðàìåòð
êîòîðîé ïåðåäàåòñÿ ïî ññûëêå.</p>
<p>Íàïðèìåð:</p>
<blockquote>
<p><code><b>type</b> <br>&nbsp; Complex = <b>record</b><br>&nbsp;&nbsp;&nbsp; re,im: real;<br>&nbsp;&nbsp;&nbsp;
<strong>static</strong><b><span lang="en-us"> </span>function</b> <b>operator</b>+(a,b: Complex): Complex; <br>&nbsp;&nbsp;&nbsp;
<b>begin</b><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result.re := a.re + b.re;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result.im := a.im + b.im;
<br>&nbsp;&nbsp;&nbsp; <b>end</b>; <br>&nbsp;&nbsp;&nbsp;
<strong>static</strong><b><span lang="en-us"> </span>function</b> <b>operator</b>=(a,b: Complex): boolean; <br>&nbsp;&nbsp;&nbsp; <b>begin</b><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := (a.re = b.re)
<b>and</b> (a.im = b.im);<br>&nbsp;&nbsp;&nbsp; <b>end</b>; <br>&nbsp; <b>end</b>;</code></p>
</blockquote>
<p>Äëÿ ïåðåãðóçêè îïåðàöèé äåéñòâóþò ñëåäóþùèå ïðàâèëà:</p>
<ol>
<li>Ïåðåãðóæàòü ìîæíî âñå îïåðàöèè çà èñêëþ÷åíèåì
<code>@</code> (âçÿòèå àäðåñà), <b><code>as</code></b>,
<code><b>is</b></code>, <code>new</code>. Êðîìå òîãî,
ìîæíî ïåðåãðóæàòü ñïåöèàëüíûå áèíàðíûå îïåðàöèè <code>+=</code>,
<code>-=</code>, <code>*=</code>, <code>/=</code>,
íå âîçâðàùàþùèå çíà÷åíèé.</li>
<li>Ïåðåãðóæàòü ìîæíî òîëüêî åùå íå ïåðåãðóæåííûå îïåðàöèè.</li>
<li>Òèï ïî êðàéíåé ìåðå îäíîãî îïåðàíäà äîëæåí ñîâïàäàòü ñ
òèïîì êëàññà èëè çàïèñè, âíóòðè êîòîðîãî îïðåäåëåíà îïåðàöèÿ.</li>
<li>Ïåðåãðóçêà îñóùåñòâëÿåòñÿ ñ ïîìîùüþ ñòàòè÷åñêîé ôóíêöèè-ìåòîäà,
êîëè÷åñòâî ïàðàìåòðîâ êîòîðîé ñîâïàäàåò ñ êîëè÷åñòâîì ïàðàìåòðîâ
ñîîòâåòñòâóþùåé îïåðàöèè (2 - äëÿ áèíàðíîé, 1 - äëÿ óíàðíîé).</li>
<li>Ïåðåãðóçêà îïåðàöèé <code>+=</code>, <code>-=</code>,
<code>*=</code>, <code>/=</code>
äëÿ ñîîòâåòñòâóþùèõ îïåðàòîðîâ
îñóùåñòâëÿåòñÿ ñ ïîìîùüþ ñòàòè÷åñêîé ïðîöåäóðû-ìåòîäà, ïåðâûé ïàðàìåòð êîòîðîé ïåðåäàåòñÿ ïî
ññûëêå è èìååò òèï çàïèñè èëè êëàññà, â êîòîðîì îïðåäåëÿåòñÿ äàííàÿ
îïåðàöèÿ, âòîðîé - ïåðåäàåòñÿ ïî çíà÷åíèþ è ñîâìåñòèì ïî ïðèñâàèâàíèþ ñ
ïåðâûì. Ïåðåãðóçêà îñòàëüíûõ îïåðàöèé îñóùåñòâëÿåòñÿ ñ ïîìîùüþ ñòàòè÷åñêèõ
ôóíêöèé-ìåòîäîâ. </li>
<li>Îïåðàöèè ïðèâåäåíèÿ òèïà <span lang="ru">çàäàþòñÿ ñòàòè÷åñêèìè
ôóíêöèÿìè, ó êîòîðûõ </span>âìåñòî èìåíè <span lang="ru">èñïîëüçóåòñÿ </span>
<code><b>operator</b></code> <code><b>implicit</b></code> <span lang="ru">
(äëÿ íåÿâíîãî ïðèâåäåíèÿ òèïà) </span>è<span lang="ru">ëè </span><code><b>
operator</b></code> <code><b>explicit</b></code> <span lang="ru">(äëÿ ÿâíîãî
ïðèâåäåíèÿ òèïà)</span>. </li>
</ol>
<p>Íàïðèìåð:</p>
<blockquote>
<p><code><b>type</b> <br>&nbsp; Complex = <b>record</b><br>&nbsp;&nbsp;&nbsp;
...<br>&nbsp;&nbsp;&nbsp;
<strong>static</strong><b><span lang="en-us"> </span>function</b> <b>operator implicit</b>(d: real): Complex;<br>&nbsp;&nbsp;&nbsp;
<b>begin</b><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result.re := d;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result.im := 0;<br>&nbsp;&nbsp;&nbsp;
<b>end</b>; <br>&nbsp; &nbsp;
<strong>static</strong><b><span lang="en-us"> </span>function</b> <b>operator explicit</b>(c: Complex): string;<br>&nbsp;&nbsp;&nbsp;
<b>begin</b><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := Format('({0},{1})',c.re,c.im);<br>&nbsp;&nbsp;&nbsp;
<b>end</b>;<br>&nbsp;&nbsp;&nbsp;
<strong>static</strong><b><span lang="en-us"> </span>procedure</b> <b>operator</b>+=(<b>var</b> c: Complex;
value: Complex);<br>&nbsp;&nbsp;&nbsp; <b>begin</b><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
c.re += value.re;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.im += value.im;<br>&nbsp;&nbsp;&nbsp;
<b>end</b>;<br>&nbsp;&nbsp;&nbsp;
<strong>static</strong><span lang="en-us"><b> </b> </span><b>function</b> <b>operator</b>+(c,c1: Complex):
Complex;<br>&nbsp;&nbsp;&nbsp; <b>begin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </b><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Result.re := c.re + c1.re;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Result.im := c.im + c1.im;
<br>&nbsp;&nbsp;&nbsp;
<b>end</b>;<br>&nbsp; <b>end</b>;</code></p>
</blockquote>
<p>Ìîæíî ïåðåãðóæàòü îïåðàöèè ñ ïîìîùüþ <a href="extensionmethods.html">ìåòîäîâ ðàñøèðåíèÿ</a> - â ýòîì ñëó÷àå ïðè
îïèñàíèè ïîäïðîãðàììû íå ñëåäóåò ïèñàòü ñëîâî class. Íàïðèìåð, òàê â ñèñòåìíîì ìîäóëå
ðåàëèçîâàíî äîáàâëåíèå ÷èñëà ê ñòðîêå:</p>
<blockquote>
<p><code><strong>function</strong> operator+(str: string; n:
integer): string; <strong>extensionmethod</strong>;<br><strong>begin</strong><br>&nbsp; result := str +
n.ToString;<br><strong>end</strong>;</code></p>
</blockquote>
</body>
</html>