pascalabcnet/PABCNetHelp/LangGuide/Interfaces/indexinterf.html
Mikhalkovich Stanislav 7aed6ed062 Print($'{Arr(1,2,3)}')
теперь печатает содержимое массива
2025-11-11 22:04:03 +03:00

116 lines
6.3 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>