Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
as3_learning.pdf
Скачиваний:
43
Добавлен:
21.05.2015
Размер:
1.8 Mб
Скачать

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

134

Объектно-ориентированное программирование на языке ActionScript

Здесь не приводится подробное описание класса Square, но он похож на класс EquilateralTriangle, в котором есть конструктор и собственные версии методов getArea() и describe().

Полиморфизм и фабричный метод

Набор классов, в которых используются интерфейсы и наследования, может применяться для достижения разных интересных целей. Например, все классы фигур, описанные выше, либо реализуют интерфейс IGeometricShape, либо расширяют реализующий его суперкласс. Поэтому если переменная определена в качестве экземпляра IGeometricShape, совершенно не нужно знать, является ли она на самом деле экземпляром класса Circle или Square, чтобы вызвать ее метод describe().

Следующий код демонстрирует, как это происходит.

var myShape:IGeometricShape = new Circle(100); trace(myShape.describe());

Когда вызывается метод myShape.describe(), он выполняет метод Circle.describe(), так как несмотря на то, что переменная определена как экземпляр IGeometricShape, ее базовым классом является Circle.

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

Приложение GeometricShapes применяет этот тип полиморфизма на базе интерфейса, используя упрощенную версию шаблона, известного под названием «фабричный метод». Термин фабричный метод обозначает функцию, которая возвращает объект, базовый тип данных или содержимое которого могут быть разными в зависимости от контекста.

Описанный здесь класс GeometricShapeFactory определяет фабричный метод с именем createShape().

Последнее обновление 12.5.2011.

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

135

Объектно-ориентированное программирование на языке ActionScript

package com.example.programmingas3.geometricshapes

{

public class GeometricShapeFactory

{

public static var currentShape:IGeometricShape;

public static function createShape(shapeName:String, len:Number):IGeometricShape

{

switch (shapeName)

{

case "Triangle":

return new EquilateralTriangle(len);

case "Square":

return new Square(len);

case "Circle":

return new Circle(len);

}

return null;

}

public static function describeShape(shapeType:String, shapeSize:Number):String

{

GeometricShapeFactory.currentShape = GeometricShapeFactory.createShape(shapeType, shapeSize);

return GeometricShapeFactory.currentShape.describe();

}

}

}

Фабричный метод createShape() позволяет конструкторам подклассов фигур определять детали создаваемых ими экземпляров и возвращать новые объекты в качестве экземпляров IGeometricShape, чтобы они проходили более общую обработку в приложении.

Метод describeShape() в предыдущем примере демонстрирует, как приложение может использовать фабричный метод для получения общей ссылки на более конкретный объект. Приложение может получить описание для только что созданного объекта Circle, как показано ниже.

GeometricShapeFactory.describeShape("Circle", 100);

Затем метод describeShape() вызывает фабричный метод createShape() с теми же параметрами, сохраняя новый объект Circle в статической переменной currentShape, которая была задана в качестве объекта IGeometricShape. После этого вызывается метод describe() объекта currentShape, и в результате разрешения этот метод автоматически выполняет метод Circle.describe(), возвращая подробное описание круга.

Расширение примера приложения

Настоящая сила интерфейсов и наследования становится очевидной, когда требуется расширить или изменить приложение.

Последнее обновление 12.5.2011.

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

136

Объектно-ориентированное программирование на языке ActionScript

Допустим, требуется добавить новую фигуру, пятиугольник, в этот пример приложения. Для этого нужно создать класс Pentagon, который расширяет класс RegularPolygon и определяет собственные версии методов getArea() и describe(). После этого следует добавить новый элемент «Pentagon» (Пятиугольник) в комбинированное поле пользовательского интерфейса приложения. Вот и все! Класс Pentagon автоматически получает методы getPerimeter() и getSumOfAngles(), наследуя их от класса RegularPolygon. Так как класс Pentagon является потомком класса, который реализует интерфейс IGeometricShape, его экземпляр также можно создать в качестве экземпляра IGeometricShape. Это означает, что для добавления нового типа фигуры не требуется изменять сигнатуру методов класса GeometricShapeFactory (и, следовательно, не требуется изменять коды, использующие класс GeometricShapeFactory).

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

Последнее обновление 12.5.2011.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]