Cоставные типы  ActionScript

 

 

Как уже известно из предыдущего примера с протоколирующим классом, класс 

может не только наследоваться от другого класса, но и реализовывать интерфейс. 

Экземпляры подкласса одновременно принадлежат типу данных суперкласса и типу 

данных интерфейса. Например, экземпляры класса LogUI из рассмотренного  

примера принадлежали типам данных Sprite и LogRecipient, поскольку класс LogUI 

был унаследован от класса Sprite и реализовывал интерфейс LogRecipient.  

Рассмотрим эту важную архитектурную структуру на новом примере. 

составных типов 

Как уже известно из предыдущего примера с протоколирующим классом, класс 

может не только наследоваться от другого класса, но и реализовывать интерфейс. 

Экземпляры подкласса одновременно принадлежат типу данных суперкласса и типу 

данных интерфейса. Например, экземпляры класса LogUI из рассмотренного  

примера принадлежали типам данных Sprite и LogRecipient, поскольку класс LogUI 

был унаследован от класса Sprite и реализовывал интерфейс LogRecipient.  

Рассмотрим эту важную архитектурную структуру на новом примере. 

Для понимания материала, изложенного в этом разделе, требуется предварительное 

знание массивов (упорядоченных списков значений), которые еще не рассматривались 

в этой книге. 

 

Предположим, мы создаем приложение, которое сохраняет объекты на сервере 

с помощью серверного сценария. Класс каждого сохраняемого объекта обязан  

предоставить метод serialize ( ), возвращающий строковое представление  

экземпляров данного класса. Строковое представление используется для воссоздания 

определенного объекта с нуля. 

Одним из классов нашего приложения является простой класс Rectangle с  

переменными экземпляра width, height, fillColor и lineColor. Для  

представления объектов Rectangle в виде строк класс Rectangle реализует метод 

serialize! ), который возвращает строку следующего формата: 

"width=значение|height=значение |fillColor=значение|lineColor=значение"

Чтобы сохранить объект Rectangle на сервере, мы вызываем метод serialize ( ) 
над данным объектом и передаем полученную строку в наш серверный сценарий. 
В дальнейшем мы сможем получить эту строку и создать новый экземпляр класса 
Rectangle, размеры и цвет которого будут соответствовать значениям исходного 
экземпляра. 
Для упрощения данного примера мы будем полагать, что каждый сохраняемый  
объект в приложении должен сохранять только имена переменных и их значения. Мы 
также будем полагать, что никакие значения переменных сами по себе не являются 
объектами, для которых требуется сериализация (то есть преобразован в строку). 
Когда наступит время сохранить состояние нашего приложения, экземпляр  
пользовательского класса StorageManager выполнит следующие задачи. 
1. Соберет объекты для сохранения. 
2. Преобразует каждый объект в строку (вызвав метод serialize ( ) ). 
3. Перенесет объекты на диск. 
Чтобы гарантировать тот факт, что каждый сохраняемый объект может быть се- 
риализован, класс StorageManager отклонит любые экземпляры классов,  
которые не принадлежат типу данных Serializable. Вот фрагмент кода класса 
StorageManager, демонстрирующий метод addOb j ect ( ), который  
используется объектами для регистрации в списке сохраняемых объектов (обратите внимание, 
что в этот метод могут быть переданы только экземпляры, принадлежащие типу 
Serializable): 
package { 
public class StorageManager { 
public function addObject (o:Serializable):void { 
Тип данных Serializable описывается одноименным интерфейсом, который 
содержит один-единственный метод serialize ( ), как показано в следующем 
коде: 
package { 
public interface Serializable { 
function serialize( ).String; 
Для выполнения сериализации создадим класс Serializer, реализующий  
интерфейс Serializable. Этот класс предоставляет следующие базовые методы для 
сериализации любого объекта: 
Q setSerializationObj ( )—указывает объект для сериализации; 
□ setSerializationVars ( ) — задает, какие переменные объекта должны быть 
сериализованы; 
□ setRecordSeparator ( ) — указывает строку, используемую в качестве  
разделителя между переменными; 
□ serialize( ) — возвращает строку, представляющую объект. 

Рассмотрим исходный код класса Serializer: 
package { 
public class Serializer implements Serializable { 
private var serializationVars:Array; 
private var serializationObj:Serializable; 
private var recordSeparator:String; 
public function Serializer ( ) { 
setSeri ali zati onObj(thi s); 
public function setSerializationVars (vars:Array):void { 
serializationVars = vars; 
public function setSerializationObj (obj:Serializable):void { 
serializationObj = obj; 
public function setRecordSeparator (rs:String):void { 
recordSeparator = rs; 
public function serialize ( ):String { 
var s:String = ""; 
// Обратите внимание, что счетчик цикла 
// уменьшается до нуля, 
// а его обновление (декремент i) происходит внутри 
// условного выражения цикла 
for (var i:int = serializationVars.length; --i >= 0; ) { 
s += serializationVars 
+ "=" + String(serializationObj[serializationVars]); 
if (i > 0) { 
s += recordSeparator; 
return s; 
} " 
Если какой-либо класс желает воспользоваться возможностями сериализации 
класса Serializer, то может просто расширить его. Класс, непосредственно  
расширивший класс Serializer, унаследует и интерфейс Serializable, и  
реализацию этого интерфейса классом Serializer. 
Обратите внимание на общую структуру системы сериализации: класс Serializer 
реализует интерфейс Serializable, предоставляя базовую реализацию, которая 
может быть использована в других классах через процедуру наследования. Но при 
этом классы могут реализовать интерфейс Serializable самостоятельно,  
предоставив желаемое поведение для метода serialize( ). 




BACK NEXT

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