pascalabcnet/PABCNetHelp/LangGuide/Interfaces/indexinterf.html

116 lines
6.3 KiB
HTML
Raw Permalink Normal View History

<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; Print(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; Println('Преобразование успешно');</code></p>
</blockquote>
</body>
</html>