55 lines
2.7 KiB
HTML
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> writeln(Self)<br>
|
|
<strong>end</strong>;<br>
|
|
<strong><br>procedure</strong> MyPrintEx(Self: integer); <strong>
|
|
extensionmethod</strong>;<br><strong>begin</strong><br> writeln(Self)<br>
|
|
<strong>end</strong>;<br>
|
|
<br><strong>begin<br></strong> MyPrint(1);<br> 1.MyPrintEx;<br>
|
|
<strong>end</strong>.</code></blockquote>
|
|
<p>Çäåñü MyPrint - ýòî îáû÷íàÿ ïðîöåäóðà ñ ïàðàìåòðîì òèïà integer, MyPrintEx -
|
|
ìåòîä ðàñøèðåíèÿ òèïà integer. Ïðè ýòîì ïðè âûçîâå ïåðâûé ïàðàìåòð MyPrintEx
|
|
ñòàíîâèòñÿ îáúåêòîì, âûçûâàþùèì MyPrintEx êàê ìåòîä.</p>
|
|
<p>Ìîæíî ðàñøèðèòü òèï ïîñëåäîâàòåëüíîñòè, òîãäà âñå êëàññû, ÿâëÿþùèåñÿ
|
|
ïîñëåäîâàòåëüíîñòÿìè (äèíàìè÷åñêèå îäíîìåðíûå ìàññèâû, ñïèñêè List<T>, ìíîæåñòâà
|
|
HashSet<T> è SortedSet<T>),
|
|
ïîëó÷àò ýòîò ìåòîä. Íàïðèìåð, â ñèñòåìíîì ìîäóëå PABCSystem òàê ââåäåí ìåòîä
|
|
ðàñøèðåíèÿ ForEach äëÿ ïîñëåäîâàòåëüíîñòåé:</p>
|
|
<blockquote><code><strong>procedure</strong> &ForEach<T>(Self: <strong>sequence
|
|
of</strong> T; action: T -> ()); <strong>extensionmethod</strong>;<br>
|
|
<strong>begin</strong><br> <strong>foreach</strong> x: T <strong>in</strong>
|
|
Self <strong>do</strong><br> action(x);<br><strong>end</strong>;</code></blockquote>
|
|
<p>Ñ ïîìîùüþ ìåòîäîâ ðàñøèðåíèÿ ìîæíî <a href="operoverloading.html">ïåðåãðóæàòü
|
|
îïåðàöèè</a>:</p>
|
|
<blockquote><code><strong>procedure operator</strong>+=<T>(a: List<T>; x: T):
|
|
List<T>; <strong>extensionmethod</strong>;<br><strong>begin</strong><br>
|
|
a.Add(x);<br><strong>end</strong>;</code></blockquote>
|
|
<p> ýòîì ñëó÷àå ïåðâûé ïàðàìåòð íå îáÿçàí èìåòü èìÿ Self.</p>
|
|
<p>Äëÿ ìåòîäîâ ðàñøèðåíèÿ èìååòñÿ ðÿä îãðàíè÷åíèé:</p>
|
|
<ul>
|
|
<li>Ìåòîäû ðàñøèðåíèÿ íå ìîãóò áûòü âèðòóàëüíûìè.</li>
|
|
<li>Åñëè ìåòîä ðàñøèðåíèÿ èìååò òî æå èìÿ, ÷òî è îáû÷íûé ìåòîä, òî
|
|
ïðåäïî÷òåíèå îòäà¸òñÿ îáû÷íîìó ìåòîäó. </li>
|
|
</ul>
|
|
<p> </p>
|
|
</body>
|
|
|
|
</html> |