Руководство по actionscript. часть 1, стр. 108
Public class ReadOnlyRectangle extends Rectangle { // Следующее определение фактически блокирует метод setSizeC ) // для экземляров класса ReadOnlyRectangle. override public function setSize (newW, newH) { // Никаких действий
}
}
Методы-конструкторы в подклассах
Теперь, когда мы рассмотрели поведение методов и переменных экземпляра относительно наследования, обратим наше внимание на методы-конструкторы.
Вспомним, что метод-конструктор инициализирует экземпляры класса следующими способами:
? вызывая методы, которые выполняют задачи настройки;
? присваивая значения переменным созданного объекта.
Когда происходит расширение класса, подкласс может определять собственный метод-конструктор. На конструктор подкласса возлагаются следующие функции:
? выполнять задачи настройки, относящиеся к подклассу;
? присваивать значения переменным, описанным в подклассе;
? вызывать метод-конструктор подкласса (иногда называемый суперконструктором).
Если в подклассе определен метод-конструктор, в нем обязательно должен вызываться конструктор суперкласса с помощью ключевого слова super. Более того, конструктор суперкласса должен вызываться до обращения к любой переменной или методу экземпляра. Если конструктор суперкласса не будет вызван явно, компилятор автоматически добавит вызов конструктора суперкласса без аргументов. И наконец, ключевое слово super не должно использоваться в методе-конструкторе более одного раза.
Запрещение использования ключевого слова super после того, как произошло обращение к любой переменной или методу экземпляра, имеет следующие преимущества:
? исключается вызов методов над объектом, который еще не был проинициали-зирован;
? устраняется доступ к переменным объекта, который еще не был проинициали-зирован;
? исключается возможность перезаписи значений переменных, присвоенных в конструкторе подкласса, в результате последующего вызова конструктора суперкласса.
Не путайте две разновидности оператора super. Первая разновидность — super() — вызывает метод-конструктор суперкласса. Вторая разновидность — super. имяМетода() — вызывает метод суперкласса. Использование первой разновидности допустимо только в методе-конструкторе. Вторая разновидность может многократно применяться в любом месте метода-конструктора или метода экземпляра.
Рассмотрим применение оператора super для вызова метода-конструктора суперкласса в простейшем случае. Следующий код описывает класс А с пустым методом-конструктором:
public class А { public function А ( ) { }
}
Следующий код описывает класс В, который расширяет класс А. Внутри метода-конструктора класса В мы используем оператор super для вызова метода-конструктора класса А:
public class В extends А { // Конструктор подкласса public function В ( ) {
// Вызов метода-конструктора суперкласса
super( );
}
}
С точки зрения функциональности следующие описания двух методов-конструкторов являются синонимами. В первом случае метод-конструктор суперкласса вызывается явно; во втором случае среда выполнения Flash вызывает метод-конструктор суперкласса неявно.
public function В ( ) { // Явный вызов метода-конструктора суперкласса super( );
}
public function В ( ) { // Вызов конструктора отсутствует. // Среда Flash вызовет конструктор автоматически
}
Если в подклассе метод-конструктор не определен вообще, то компилятор языка ActionScript автоматически создаст метод-конструктор и добавит в него одну инструкцию — вызов оператора super. Следующие два описания класса В функционально являются идентичными. Первое описание в явном виде представляет то, что для второго описания автоматически создает компилятор: