/
n-dimens
/
pascalabcnet
Обзор
Документация
Войти
/
n-dimens
/
pascalabcnet
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
PABCNetHelp/LangGuide/Interfaces/indexinterf.html
115 строк
6 KB
samuraiGH
adding working-tree-encoding attribute (#3325)
07 ноя 2025, 16:12
Не верифицирован
07 ноя 2025, 16:12
cf1fd29
Код
Авторство
О чём код?
<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>