Интерфейсы и классы с несколькими типами данных  ActionScript

 

 

В предыдущем разделе мы создали тип данных LogRecipient, определив класс 

LogRecipient. Ограничение данного подхода заключается в том, что каждый 

получатель сообщений от класса Logger должен быть экземпляром либо класса 

LogRecipient, либо одного из его подклассов. Чтобы избавиться от этого  

ограничения, мы можем описать тип данных LogRecipient путем создания интерфейса 

LogRecipient, а не путем создания одноименного класса. В этом случае  

экземпляры любого класса, который формально согласен предоставить реализацию для 

метода update ( ), могут регистрироваться для получения журнальных  

сообщений. Посмотрим, как это работает. 

 

Синтаксически интерфейс представляет собой просто список методов.  

Например, следующий код создает интерфейс LogRecipient, содержащий  

один-единственный метод update ( ) (обратите внимание, что интерфейсы, как и классы, 

могут быть описаны с помощью модификаторов управления доступом public 

и internal). 

public interface LogRecipient { 

function update(msg:String):void; 

Как только интерфейс будет описан, любое количество классов может использовать 

ключевое слово implements, чтобы вступить в соглашение с этим интерфейсом, 

пообещав определить содержащиеся в нем методы. Как только класс даст такое 

обещание, его экземпляры будут считаться членами не только типа данных класса, 

но и типа данных интерфейса. 

Например, чтобы указать, что класс LogUI согласен определить метод update ( ) 

(описанный в интерфейсе LogRecipient), мы используем следующий код: 

class LogUI extends Sprite implements LogRecipient { 
public function update (msg:String):void { 
// Отображение статусного сообщения на экране, код не показан... 
Вместо того чтобы расширять класс LogRecipient, LogUI расширяет класс 
Sprite и реализует интерфейс LogRecipient. Поскольку класс LogUI реализует 
интерфейс LogRecipient, он должен определить метод update ( ). В противном 
случае компилятор сгенерирует следующую ошибку: 
Interface method update in namespace LogRecipient not implemented by class LogUI. 
На русском языке она будет выглядеть следующим образом: Метод интерфейса 
update из пространства имен LogRecipient не реализован классом LogUI. 
Поскольку класс LogUI обещает реализовать методы интерфейса LogRecipient, 
экземпляры этого класса могут быть использованы везде, где требуется тип данных 
LogRecipient. Экземпляры класса LogUI фактически принадлежат двум типам 
данных: LogUI и LogRecipient. Таким образом, даже несмотря на то, что класс 
LogUI расширяет класс Sprite, экземпляры класса LogUI принадлежат типу 
LogRecipient и могут благополучно передаваться в метод addRecipient ( ) 
класса Logger. 
Ошибки компилятора — это ключ ко всей системе интерфейсов. Они  
гарантируют, что класс сдержит свои обязательства по реализации методов интерфейса, тем 
самым позволив внешнему коду использовать этот класс с уверенностью в его  
правильном поведении. Эта уверенность особенно важна при разработке приложения, 
возможности которого будут расширяться другим разработчиком или  
использоваться третьими лицами. 
Теперь, когда мы получили общее представление об интерфейсах и о том, как они 
используются, рассмотрим детали синтаксиса. 




BACK NEXT

Сайт является частным собранием материалов и представляет собой любительский информационно-образовательный ресурс. Вся информация получена из открытых источников. Администрация не претендует на авторство использованных материалов. Все права принадлежат их правообладателям