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