98 lines
5.4 KiB
HTML
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> Complex = <b>record</b><br> re,im: real;<br>
|
|
<strong>static</strong><b><span lang="en-us"> </span>function</b> <b>operator</b>+(a,b: Complex): Complex; <br>
|
|
<b>begin</b><br> Result.re := a.re + b.re;<br> Result.im := a.im + b.im;
|
|
<br> <b>end</b>; <br>
|
|
<strong>static</strong><b><span lang="en-us"> </span>function</b> <b>operator</b>=(a,b: Complex): boolean; <br> <b>begin</b><br> Result := (a.re = b.re)
|
|
<b>and</b> (a.im = b.im);<br> <b>end</b>; <br> <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> Complex = <b>record</b><br>
|
|
...<br>
|
|
<strong>static</strong><b><span lang="en-us"> </span>function</b> <b>operator implicit</b>(d: real): Complex;<br>
|
|
<b>begin</b><br> Result.re := d;<br> Result.im := 0;<br>
|
|
<b>end</b>; <br>
|
|
<strong>static</strong><b><span lang="en-us"> </span>function</b> <b>operator explicit</b>(c: Complex): string;<br>
|
|
<b>begin</b><br> Result := Format('({0},{1})',c.re,c.im);<br>
|
|
<b>end</b>;<br>
|
|
<strong>static</strong><b><span lang="en-us"> </span>procedure</b> <b>operator</b>+=(<b>var</b> c: Complex;
|
|
value: Complex);<br> <b>begin</b><br>
|
|
c.re += value.re;
|
|
<br> c.im += value.im;<br>
|
|
<b>end</b>;<br>
|
|
<strong>static</strong><span lang="en-us"><b> </b> </span><b>function</b> <b>operator</b>+(c,c1: Complex):
|
|
Complex;<br> <b>begin </b><br>
|
|
Result.re := c.re + c1.re;
|
|
<br>
|
|
Result.im := c.im + c1.im;
|
|
<br>
|
|
<b>end</b>;<br> <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> result := str +
|
|
n.ToString;<br><strong>end</strong>;</code></p>
|
|
</blockquote>
|
|
</body>
|
|
|
|
</html> |