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

55 lines
2.7 KiB
HTML

<html>
<head>
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
<param name="Keyword" value="Ìåòîäû ðàñøèðåíèÿ">
<param name="Keyword" value="extensionmethod">
</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>Ëþáîé ñóùåñòâóþùèé òèï, õðàíÿùèéñÿ âî âíåøíåé dll, è âñå òèïû ñòàíäàðòíîé
áèáëèòåêè .NET ìîæíî ðàñøèðèòü íîâûìè ìåòîäàìè. Ìåòîä ðàñøèðåíèÿ îïðåäåëÿåòñÿ
êàê ïðîöåäóðà èëè ôóíêöèÿ ñ ìîäèôèêàòîðîì <code> <strong>
extensionmethod</strong></code>. Ïåðâûé ïàðàìåòð ìåòîäà ðàñøèðåíèÿ
îáÿçàòåëüíî äîëæåí èìåòü èìÿ Self è ïðèíàäëåæèò ê ðàñøèðÿåìîìó òèïó. Ñðàâíèì äâå
ïðîöåäóðû, îïèñàííûå íèæå:</p>
<blockquote><code><strong>procedure</strong> MyPrint(Self: integer);<br><strong>begin</strong><br>&nbsp; writeln(Self)<br>
<strong>end</strong>;<br>
<strong><br>procedure</strong> MyPrintEx(Self: integer); <strong>
extensionmethod</strong>;<br><strong>begin</strong><br>&nbsp; writeln(Self)<br>
<strong>end</strong>;<br>
<br><strong>begin<br></strong>&nbsp; MyPrint(1);<br>&nbsp; 1.MyPrintEx;<br>
<strong>end</strong>.</code></blockquote>
<p>Çäåñü MyPrint - ýòî îáû÷íàÿ ïðîöåäóðà ñ ïàðàìåòðîì òèïà integer, MyPrintEx -
ìåòîä ðàñøèðåíèÿ òèïà integer. Ïðè ýòîì ïðè âûçîâå ïåðâûé ïàðàìåòð MyPrintEx
ñòàíîâèòñÿ îáúåêòîì, âûçûâàþùèì MyPrintEx êàê ìåòîä.</p>
<p>Ìîæíî ðàñøèðèòü òèï ïîñëåäîâàòåëüíîñòè, òîãäà âñå êëàññû, ÿâëÿþùèåñÿ
ïîñëåäîâàòåëüíîñòÿìè (äèíàìè÷åñêèå îäíîìåðíûå ìàññèâû, ñïèñêè List&lt;T&gt;, ìíîæåñòâà
HashSet&lt;T&gt; è SortedSet&lt;T&gt;),
ïîëó÷àò ýòîò ìåòîä. Íàïðèìåð, â ñèñòåìíîì ìîäóëå PABCSystem òàê ââåäåí ìåòîä
ðàñøèðåíèÿ ForEach äëÿ ïîñëåäîâàòåëüíîñòåé:</p>
<blockquote><code><strong>procedure</strong> &amp;ForEach&lt;T&gt;(Self: <strong>sequence
of</strong> T; action: T -&gt; ()); <strong>extensionmethod</strong>;<br>
<strong>begin</strong><br>&nbsp; <strong>foreach</strong> x: T <strong>in</strong>
Self <strong>do</strong><br>&nbsp;&nbsp;&nbsp; action(x);<br><strong>end</strong>;</code></blockquote>
<p>Ñ ïîìîùüþ ìåòîäîâ ðàñøèðåíèÿ ìîæíî <a href="operoverloading.html">ïåðåãðóæàòü
îïåðàöèè</a>:</p>
<blockquote><code><strong>procedure operator</strong>+=&lt;T&gt;(a: List&lt;T&gt;; x: T):
List&lt;T&gt;; <strong>extensionmethod</strong>;<br><strong>begin</strong><br>&nbsp;
a.Add(x);<br><strong>end</strong>;</code></blockquote>
<p> ýòîì ñëó÷àå ïåðâûé ïàðàìåòð íå îáÿçàí èìåòü èìÿ Self.</p>
<p>Äëÿ ìåòîäîâ ðàñøèðåíèÿ èìååòñÿ ðÿä îãðàíè÷åíèé:</p>
<ul>
<li>Ìåòîäû ðàñøèðåíèÿ íå ìîãóò áûòü âèðòóàëüíûìè.</li>
<li>Åñëè ìåòîä ðàñøèðåíèÿ èìååò òî æå èìÿ, ÷òî è îáû÷íûé ìåòîä, òî
ïðåäïî÷òåíèå îòäà¸òñÿ îáû÷íîìó ìåòîäó. </li>
</ul>
<p>&nbsp;</p>
</body>
</html>