pascalabcnet/PABCNetHelp/LangGuide/Interfaces/indexinterf.html

116 lines
5 KiB
HTML

<html>
<head>
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
<param name="Keyword" value="interface">
</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><font color="#FF0000"><i><b>Èíòåðôåéñ</b></i></font> - ýòî
òèï äàííûõ, ñîäåðæàùèé íàáîð çàãîëîâêîâ ìåòîäîâ è ñâîéñòâ, ïðåäíàçíà÷åííûõ äëÿ
ðåàëèçàöèè íåêîòîðûì êëàññîì. Èíòåðôåéñû îïèñûâàþòñÿ â ðàçäåëå <code><b>type</b></code>
ñëåäóþùèì îáðàçîì:</p>
<blockquote>
<p><i>ÈìÿÈíòåðôåéñà</i><code> = </code><b><code>interface</code></b><br>&nbsp;
<i>îáúÿâëåíèÿ ìåòîäîâ è ñâîéñòâ</i><br><b><code>end</code></b><code>;</code></p>
</blockquote>
<p>Äëÿ ìåòîäà ïðèâîäèòñÿ òîëüêî çàãîëîâîê, äëÿ ñâîéñòâà
ïîñëå âîçâðàùàåìîãî òèïà óêàçûâàþòñÿ íåîáõîäèìûå ìîäèôèêàòîðû äîñòóïà
read è write. </p>
<p>Íàïðèìåð:</p>
<blockquote>
<p><code><b>type</b><br>&nbsp; IShape = <b>interface</b><br>&nbsp;&nbsp;&nbsp;
<b>procedure</b> Draw;<br>&nbsp;&nbsp;&nbsp; <b>property</b> X: integer <b>
read</b>;<br>&nbsp;&nbsp;&nbsp; <b>property</b> Y: integer <b>read</b>;<br>&nbsp;
<b>end</b>;<br>
&nbsp; ICloneable = <b>interface</b><br>&nbsp;&nbsp;&nbsp; <b>function</b>
Clone: Object;<br>&nbsp; <b>end</b>;</code></p>
</blockquote>
<p>Ïîëÿ è ñòàòè÷åñêèå ìåòîäû íå ìîãóò âõîäèòü â èíòåðôåéñ.</p>
<p>Êëàññ ðåàëèçóåò èíòåðôåéñ, åñëè îí ðåàëèçóåò âñå ìåòîäû è
ñâîéñòâà èíòåðôåéñà â
<code><b>public</b></code>-ñåêöèè. Åñëè
êëàññ íå ðåàëèçóåò õîòÿ áû îäèí ìåòîä èëè ñâîéñòâî èíòåðôåéñà, âîçíèêàåò îøèáêà
êîìïèëÿöèè. Êëàññ ìîæåò ðåàëèçîâûâàòü òàêæå íåñêîëüêî èíòåðôåéñîâ. Ñïèñîê
ðåàëèçóåìûõ èíòåðôåéñîâ óêàçûâàåòñÿ â ñêîáêàõ ïîñëå êëþ÷åâîãî ñëîâà
<code><b>class</b></code>
(åñëè óêàçàíî èìÿ ïðåäêà, òî ïîñëå èìåíè ïðåäêà). </p>
<p>Íàïðèìåð:</p>
<blockquote>
<p><code><b>type</b><br>&nbsp; Point = <b>class</b>(IShape,ICloneable)<br>
&nbsp; <b>private</b><br>
&nbsp;&nbsp;&nbsp; xx,yy: integer;<br>
&nbsp; <b>public<br>
&nbsp;&nbsp;&nbsp; constructor</b> Create(x,y: integer);<br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xx := x; yy := y;<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;&nbsp; <br>&nbsp;&nbsp;&nbsp; <b>procedure</b>
Draw; <b>begin end</b>;<br>&nbsp;&nbsp;&nbsp; <b>property</b> X: integer <b>
read</b> xx;<br>&nbsp;&nbsp;&nbsp; <b>property</b> Y: integer <b>read</b> yy;<br>&nbsp;&nbsp;&nbsp;
<b>function</b> Clone: Object;<br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := new Point(xx,yy);<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>
&nbsp;&nbsp;&nbsp; <b>procedure</b> Print;<br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write(xx,' ',yy);<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>&nbsp; <b>end</b>;</code></p>
</blockquote>
<p>Èíòåðôåéñû ìîæíî íàñëåäîâàòü äðóã îò
äðóãà:&nbsp; </p>
<blockquote>
<p><code><b>type</b><br>
&nbsp; IPosition =
<b>interface</b><br>&nbsp;&nbsp;&nbsp;
<b>property</b> X: integer <b>read</b>;<br>&nbsp;&nbsp;&nbsp; <b>property</b>
Y: integer <b>read</b>;<br>&nbsp; <b>end</b>;<br>
&nbsp; IDrawable =
<b>interface</b><br>&nbsp;&nbsp;&nbsp; <b>procedure</b> Draw;<br>&nbsp; <b>end</b>;<br>
&nbsp; IShape =
<b>interface</b>(IPosition,IDrawable)<br>&nbsp; <b>end</b>;</code></p>
</blockquote>
<p>Èíòåðôåéñ ïî-ñóùåñòâó ïðåäñòàâëÿåò ñîáîé àáñòðàêòíûé êëàññ
áåç ðåàëèçàöèè âõîäÿùèõ â íåãî ìåòîäîâ. Äëÿ èíòåðôåéñîâ, â ÷àñòíîñòè, ïðèìåíèìû
âñå ïðàâèëà <a href="../Classes/classcast.html">ïðèâåäåíèÿ òèïîâ îáúåêòîâ</a>:
òèï îáúåêòà, ðåàëèçóþùåãî èíòåðôåéñ, ìîæåò áûòü íåÿâíî ïðèâåäåí ê òèïó
èíòåðôåéñà, à îáðàòíîå ïðåîáðàçîâàíèå ïðîèçâîäèòñÿ òîëüêî ÿâíî è ìîæåò âûçâàòü
èñêëþ÷åíèå ïðè íåâîçìîæíîñòè ïðåîáðàçîâàíèÿ:</p>
<blockquote>
<p><code><b>var</b> ip: IShape := new Point(20,30);<br>
ip.Draw;<br>
Point(ip).Print;</code></p>
</blockquote>
<p>Âñå ìåòîäû êëàññà, ðåàëèçóþùåãî èíòåðôåéñ, ÿâëÿþòñÿ
âèðòóàëüíûìè áåç èñïîëüçîâàíèÿ êëþ÷åâûõ ñëîâ <code><b>virtual</b></code>
èëè <code><b>override</b></code>. Â
÷àñòíîñòè, <code>ip.Draw</code> âûçîâåò ìåòîä
<code>Draw</code> êëàññà <code>Point</code>.
Îäíàêî, öåïî÷êà âèðòóàëüíîñòè òàêèõ ìåòîäîâ îáðûâàåòñÿ. ×òîáû ïðîäîëæèòü öåïî÷êó
âèðòóàëüíîñòè ìåòîäîâ, ðåàëèçóþùèõ èíòåðôåéñ, â ïîäêëàññàõ, ñëåäóåò èñïîëüçîâàòü
êëþ÷åâîå ñëîâî <code><b>virtual</b></code>:</p>
<p><code><b>type</b><br>&nbsp; Point = <b>class</b>(IShape,ICloneable)<br>
&nbsp;&nbsp;&nbsp; ...<br>
&nbsp;&nbsp;&nbsp;
<b>function</b> Clone: Object; <b>virtual</b>;<br>
&nbsp;&nbsp;&nbsp; <b>begin</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := new Point(xx,yy);<br>
&nbsp;&nbsp;&nbsp; <b>end</b>;<br>
&nbsp; <b>end</b>;</code></p>
<p>Äëÿ èíòåðôåéñîâ, êàê è äëÿ êëàññîâ, ìîæíî òàêæå èñïîëüçîâàòü
îïåðàöèè <code><b>is</b></code> è <code><b>as</b></code>:</p>
<blockquote>
<p><code><b>if</b> ip <b>is</b> Point <b>then</b><br>
&nbsp; ...<br>
<b>var</b> p: Point := ip <b>as</b> Point;<br>
<b>if</b> p&lt;&gt;nil <b>then</b> <br>
&nbsp; writeln('Ïðåîáðàçîâàíèå óñïåøíî');</code></p>
</blockquote>
</body>
</html>