Аргументы в  интерфейсах  ActionScript

 

 

Предположим, мы создаем протоколирующий класс Logger, который рапортует 

о статусных сообщениях («записях журнала») программы в процессе ее  

выполнения. Многие классы получают статусные сообщения от класса Logger и  

по-разному реагируют на них. Например, один класс — LogUI — отображает журнальные 

сообщения на экране, другой класс — Live Log— отправляет предупреждение 

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

администрирования, а еще один класс — LogTracker — добавляет журнальные сообщения 

в базу для ведения статистики. Для получения журнальных сообщений каждый 

класс определяет метод update ( ). Чтобы отправить сообщение объектам всех 

заинтересованных классов, класс Logger вызывает метод update ( ). 

Пока все это кажется логичным, но что произойдет, если мы забудем определить 

метод update ( ) в классе LogUI? Статусное сообщение будет отправлено,  

однако объекты класса LogUI не получат его. Нам необходим такой подход, который 

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

update ( ). 

Чтобы предоставить такую гарантию, предположим, что мы ввели новое  

требование в нашу программу: любой объект, желающий получать журнальные  

сообщения от класса Logger, должен быть экземпляром базового класса LogRecipient 

(мы предоставим его описание) или экземпляром одного из подклассов класса 

LogRecipient. Реализация метода update ( ) в классе LogRecipient будет 

включать базовую функциональность, попросту отображая журнальное сообщение 

с помощью функции trace ( ): 

public class LogRecipient { 

public function update (msg:String)-.void { 

trace(msg); 

Теперь любой класс, который желает получать журнальные сообщения от класса 

Logger, просто расширяет класс LogRecipient и, если требуется  

специфическое поведение, перекрывает метод update ( ) класса LogRecipient, реализуя 

желаемое поведение. Например, следующий класс LogTracker расширяет класс 

LogRecipient и перекрывает метод update ( ), реализуя функциональность 

сохранения информации в базе данных: 

public class LogTracker extends LogRecipient { 

// Перекрытый метод update( ) класса LogRecipient 

override public function update (msg:String):void { 

// Сохранение сообщения об ошибке в базе данных. Код не показан... 

Возвращаясь к классу Logger, мы определим метод addRecipient ( ), который 

выполняет регистрацию объекта, желающего получать журнальные сообщения. 

Базовое описание метода addRecipient ( ) представлено ниже. Обратите  

внимание, что в метод addRecipient ( ) могут передаваться только экземпляры класса 

LogRecipient и его подклассов: 

public class Logger { 

public function addRecipient A г:LogRecipient):Boolean { 

// Размещаемый здесь код должен выполнять регистрацию объекта 1г 

// для получения статусных сообщений и возвращать значение типа Boolean. 

// которое отражает результат выполненной операции (код не показан). 

Если передаваемый в метод addRecipient ( ) объект не принадлежит типу 

LogRecipient, компилятор сгенерирует ошибку несоответствия типов. Если этот 

объект является экземпляром подкласса класса LogRecipient, в котором не  

реализован метод update ( ), то по крайней мере будет выполнена базовая версия 

метода update ( ) (определенная в классе LogRecipient). 

Приемлемый вариант, не правда ли? Почти. Однако есть проблема. Что делать 

в том случае, если класс, желающий получать события от класса LogRecipient, 

уже расширяет другой класс? Например, предположим, что класс LogUI расширяет 
класс flash. display. Sprite: 
public class LogUI extends Sprite { 
public function update (msg:String):void { 
// Отображение статусного сообщения на экране, код не показан... 
В языке ActionScript класс не может расширять несколько классов. Класс LogUI 
уже расширяет класс Sprite, поэтому он не может расширять еще и класс 
LogRecipient. Следовательно, экземпляры класса LogUI не могут  
регистрироваться в классе Logger, чтобы получать от него статусные сообщения. В  
данной ситуации нам крайне необходим способ, позволяющий указать, что на  
самом деле экземпляры класса LogUI принадлежат двум типам данных: LogUI 
и LogRecipient. 




BACK NEXT

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