116 lines
5 KiB
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>
|
|
<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> IShape = <b>interface</b><br>
|
|
<b>procedure</b> Draw;<br> <b>property</b> X: integer <b>
|
|
read</b>;<br> <b>property</b> Y: integer <b>read</b>;<br>
|
|
<b>end</b>;<br>
|
|
ICloneable = <b>interface</b><br> <b>function</b>
|
|
Clone: Object;<br> <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> Point = <b>class</b>(IShape,ICloneable)<br>
|
|
<b>private</b><br>
|
|
xx,yy: integer;<br>
|
|
<b>public<br>
|
|
constructor</b> Create(x,y: integer);<br>
|
|
<b>begin</b><br>
|
|
xx := x; yy := y;<br>
|
|
<b>end</b>; <br> <b>procedure</b>
|
|
Draw; <b>begin end</b>;<br> <b>property</b> X: integer <b>
|
|
read</b> xx;<br> <b>property</b> Y: integer <b>read</b> yy;<br>
|
|
<b>function</b> Clone: Object;<br>
|
|
<b>begin</b><br>
|
|
Result := new Point(xx,yy);<br>
|
|
<b>end</b>;<br>
|
|
<b>procedure</b> Print;<br>
|
|
<b>begin</b><br>
|
|
write(xx,' ',yy);<br>
|
|
<b>end</b>;<br> <b>end</b>;</code></p>
|
|
</blockquote>
|
|
<p>Èíòåðôåéñû ìîæíî íàñëåäîâàòü äðóã îò
|
|
äðóãà: </p>
|
|
<blockquote>
|
|
<p><code><b>type</b><br>
|
|
IPosition =
|
|
<b>interface</b><br>
|
|
<b>property</b> X: integer <b>read</b>;<br> <b>property</b>
|
|
Y: integer <b>read</b>;<br> <b>end</b>;<br>
|
|
IDrawable =
|
|
<b>interface</b><br> <b>procedure</b> Draw;<br> <b>end</b>;<br>
|
|
IShape =
|
|
<b>interface</b>(IPosition,IDrawable)<br> <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> Point = <b>class</b>(IShape,ICloneable)<br>
|
|
...<br>
|
|
|
|
<b>function</b> Clone: Object; <b>virtual</b>;<br>
|
|
<b>begin</b><br>
|
|
Result := new Point(xx,yy);<br>
|
|
<b>end</b>;<br>
|
|
<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>
|
|
...<br>
|
|
<b>var</b> p: Point := ip <b>as</b> Point;<br>
|
|
<b>if</b> p<>nil <b>then</b> <br>
|
|
writeln('Ïðåîáðàçîâàíèå óñïåøíî');</code></p>
|
|
</blockquote>
|
|
</body>
|
|
|
|
</html>
|