Составные типы ActionScript часть 2

 

 

Например, следующий код демонстрирует класс Point, определяющий  

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

Serializer и непосредственно использует его возможности. 

package { 

public class Point extends Serializer { 

public var x:Number; 

public var у:Number; 

public function Point (x:Number, у:Number) { 

super( ); 

setRecordSeparator("."); 

setSerializationVars(["x\\ "y"]); 

this.x = x; 

this.у = у; 

Код, желающий сохранить экземпляр класса Point на диск, просто вызывает метод 

serialize ( ) над этим экземпляром, как показано в следующем примере: 

var p:Point = new PointE. 6); 

trace(p.serialize( )); // Отображает: у=6,х=5 

Стоит отметить, что класс Point непосредственно не реализует интерфейс 

Serializable. Этот класс расширяет класс Serializer, который, в свою  

очередь, реализует интерфейс Serializable. 

Класс Point не расширяет никакой другой класс, поэтому он может свободно 

расширить класс Serializer. Тем не менее, если некий класс желает  

использовать класс Serializer, но уже расширяет другой класс, вместо наследования 

необходимо применять композицию. Иными словами, вместо расширения класса 

Serializer класс непосредственно реализует интерфейс Serializable,  

сохранит объект Serializer в переменной экземпляра и переадресует вызовы метода 

serializer ( ) этому объекту. Например, рассмотрим код упомянутого ранее 

класса Rectangle. Этот класс расширяет класс Shape, но использует  

возможности класса Serializer через композицию (обратите особое внимание на строки, 

выделенные полужирным шрифтом): 

// Суперкласс Shape 

package { 

public class Shape { 

public var fillColor:uint = OxFFFFFF; 

public var lineColor:uint = 0; 

public function Shape (fillColor:uint, lineColonuint) { 

this.fillColor = fillColor; 

this.lineColor = lineColor; 

// Класс Rectangle 
package { 
// Подкласс Rectangle непосредственно реализует 
// интерфейс Serializable 
public class Rectangle extends Shape implements Serializable { 
public var width:Number = 0; 
public var height:Number = 0; 
private var serializer:Serializer: 
public function Rectangle (filIColor:uint. lineColor:uint) { 
super(fillColor, lineColor) 
// Именно здесь создается композиция 
serializer = new Serialized ); 
seri ali zer.setRecordSeparator("|"); 
seri alizer.setSeri alizationVars(["height", "width", 
"fillColor", "lineColor"]); 
serializer.setSerializationObj(this); 
public function setSize (w:Number. h:Number):void { 
width = w; 
height = h: 
public function getArea ( ):Number { 
return width * height; 
public function serialize ( ):String { 
// Здесь класс Rectangle переадресует вызов метода serialize( ) 
// экземпляру класса Serializer, сохраненному 
// в переменной serializer 
return serializer.serialize( ); 
Как и в случае с классом Point, код, желающий сохранить экземпляр класса 
Rectangle, просто вызывает метод serialize ( ) над этим объектом. Вызов 
метода через композицию будет переадресован экземпляру класса Serializer, 
сохраненному в классе Rectangle. Вот пример использования этого класса: 
var r:Rectangle = new Rectangle@xFF0000, OxOOOOFF); 
r.setSizedO, 15); 
// Отображает: 1ineColor=2551fi11 Color=167116801width=101height=15 
trace(r.serialize( )); 
Если класс желает реализовать собственную версию метода serialize ( ) вместо 
того, чтобы использовать базовую версию этого метода, предоставляемую классом 
Serial izer, он должен непосредственно реализовать интерфейс Serial izable, 
предоставив определение и само тело метода serialize( ). 
Разделение интерфейса типа данных Serializablen его реализации позволяет 
любому классу легко выбрать один из следующих вариантов реализации метода 
serialize ( ): 
□ расширить класс Serializer; 
□ использовать класс Serializer через композицию; 
□ непосредственно предоставить собственную реализацию метода serialize! ). 
Если класс не расширяет другой класс, он может расширить класс Serializer 
(этот вариант наименее трудоемкий). Если класс уже расширяет другой класс, он 
может использовать возможности класса Serializer через композицию (этот 
вариант наиболее гибкий). Наконец, если класс нуждается в собственной  
уникальной процедуре сериализации, он может непосредственно реализовать интерфейс 
Serializable (этот вариант наиболее трудоемкий, но в некоторых ситуациях 
обойтись без него невозможно). 
Принимая во внимание гибкость описанной структуры, корпорация Sun Microsystems 
рекомендует, чтобы в приложениях на языке Java любой класс, у которого могут быть 
подклассы, являлся реализацией некоего интерфейса. По существу, подклассы могут 
создаваться непосредственно от данного класса или же он может использоваться 
классом, унаследованным от другого класса, через композицию. Рекомендация  
корпорации Sun также имеет смысл и для больших приложений, разрабатываемых на 
языке ActionScript. 
На рис. 9.1 показана обобщенная структура типа данных, реализация которого 
может применяться как через наследование, так и через композицию. 
Множественное наследование типов данных через интерфейсы




BACK NEXT

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