Методы-конструкторы в подклассах ActionScript 

 

 

Теперь, когда мы рассмотрели поведение методов и переменных экземпляра  

относительно наследования, обратим наше внимание на методы-конструкторы. 

Вспомним, что метод-конструктор инициализирует экземпляры класса  

следующими способами: 

□ вызывая методы, которые выполняют задачи настройки; 

□ присваивая значения переменным созданного объекта. 

Когда происходит расширение класса, подкласс может определять собственный  

метод-конструктор. На конструктор подкласса возлагаются следующие функции: 

□ выполнять задачи настройки, относящиеся к подклассу; 

□ присваивать значения переменным, описанным в подклассе; 

□ вызывать метод-конструктор подкласса (иногда называемый  

суперконструктором). 

Если в подклассе определен метод-конструктор, в нем обязательно должен вызываться 

конструктор суперкласса с помощью ключевого слова super. Более того,  

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

экземпляра. Если конструктор суперкласса не будет вызван явно, компилятор  

автоматически добавит вызов конструктора суперкласса без аргументов. И наконец, ключевое 

слово super не должно использоваться в методе-конструкторе более одного раза. 

Запрещение использования ключевого слова super после того, как произошло 

обращение к любой переменной или методу экземпляра, имеет следующие  

преимущества: 

□ исключается вызов методов над объектом, который еще не был проинициали- 

зирован; 

□ устраняется доступ к переменным объекта, который еще не был проинициали- 

зирован; 

□ исключается возможность перезаписи значений переменных, присвоенных 

в конструкторе подкласса, в результате последующего вызова конструктора 

суперкласса. 

Рассмотрим применение оператора super для вызова метода-конструктора  
суперкласса в простейшем случае. Следующий код описывает класс А с пустым методом- 
конструктором: 
public class A { 
public function A ( ) { 
Следующий код описывает класс В, который расширяет класс А. Внутри метода- 
конструктора класса В мы используем оператор super для вызова  
метода-конструктора класса А: 
public class В extends A { 
// Конструктор подкласса 
public function В ( ) { 
// Вызов метода-конструктора суперкласса 
super( ); 
С точки зрения функциональности следующие описания двух  
методов-конструкторов являются синонимами. В первом случае метод-конструктор суперкласса 
вызывается явно; во втором случае среда выполнения Flash вызывает  
метод-конструктор суперкласса неявно. 
public function В ( ) { 
// Явный вызов метода-конструктора суперкласса 
super( ); 
public function В ( ) { 
// Вызов конструктора отсутствует. 
// Среда Flash вызовет конструктор автоматически 
Если в подклассе метод-конструктор не определен вообще, то компилятор языка 
ActionScript автоматически создаст метод-конструктор и добавит в него одну  
инструкцию — вызов оператора super. Следующие два описания класса В  
функционально являются идентичными. Первое описание в явном виде представляет то, 
что для второго описания автоматически создает компилятор: 
// Определение конструктора в явном виде 
public class В extends A { 
// Явное объявление конструктора 
public function В ( ) { 
// Явный вызов метода-конструктора суперкласса 
super( ); 
// Позволить компилятору автоматически создать конструктор по умолчанию 
public class В extends A { 
Метод-конструктор подкласса может (а зачастую так и происходит) иметь другие  
параметры, нежели его коллега из суперкласса. Например, в нашем классе Rectangle 
можно было бы определить конструктор с параметрами width и height, а класс 
Square мог бы иметь собственный конструктор с одним параметром side (у  
квадратов ширина и высота совпадает, поэтому не нужно указывать оба значения). В  
листинге 6.1 продемонстрирован этот код. 
Листинг 6.1. Конструкторы классов Rectangle и Square 
public class Rectangle { 
protected var w = 0; 
protected var h = 0; 
// Конструктор класса Rectangle 
public function Rectangle (width, height) { 
setSize(width, height); 
public function setSize (newW, newH) { 
w = newW; 
h = newH; 
public function getArea ( ) { 
return w * h; 
public class Square extends Rectangle { 
// Конструктор класса Square 
public function Square (side) { 
// Передаем параметр side в конструктор класса Rectangle 
super(side. side); 
override public function setSize (newW. newH) { 
if (newW == newH) { 
// Вызов метода setSize( ) суперкласса над текущим экземпляром 
super.setSize(newW, newH); 
Кстати, вы могли бы задаться вопросом, а не лучше ли определить метод s e t S i z e ( ) 
класса Square с одним параметром s ide, чем иметь два отдельных параметра width 
и height. Это демонстрирует следующая версия метода setSize ( ) (обратите 
внимание, что в методе больше не нужна проверка значений параметров newW и newH 
на равенство). 
override public function setSize (side) { 
// Вызов метода setSize( ) суперкласса над текущим экземпляром 
super.setSize(side, side); 
Хотя приведенная версия метода setSize ( ), несомненно, является более  
подходящей для класса Square, она приведет к ошибке, поскольку имеет  
меньшее количество параметров, чем версия метода setSize ( ) класса Rectangle 
(помните, что количество параметров, определенных в перекрывающем методе, 
должно совпадать с количеством параметров перекрываемого метода). Позднее, 
в подразд. «Наследование в сравнении с композицией» разд. «Теория  
наследования», мы рассмотрим альтернативный допустимый вариант реализации версии 
метода setSize( )c одним параметром в классе Square. 
При определении метода-конструктора подкласса обязательно указывайте все 
требуемые аргументы для конструктора суперкласса. Метод-конструктор класса 
ColoredBall из следующего примера определен неправильно, поскольку в  
метод-конструктор суперкласса не передается необходимая информация: 
public class Ball { 
private var r; 
public function Ball (radius) { 
r = radius; 
public class ColoredBall extends Ball { 
private var c; 
// Это проблематичный конструктор... 
public function ColoredBall (color) { 
// Ой! Отсутствует вызов оператора super( ). Здесь произойдет ошибка, 
// поскольку в конструктор класса Ball необходимо передать аргумент 
// для параметра radius 
с = color; 
Далее приводится исправленная версия класса ColoredBall, в которой  
требуемый аргумент передается в конструктор класса Ball: 
public class ColoredBall extends Ball { 
private var c; 
// Все исправлено... 
public function ColoredBall (radius, color) { 
super(radius); 
с = color; 
Обратите внимание, что, если придерживаться хорошего тона программирования, 
в конструкторе подкласса сначала перечисляются параметры суперкласса (в  
данном случае radius), а затем дополнительные аргументы конструктора подкласса 
(в данном случае color). 

 




BACK NEXT

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