02.02.2017, 13:24
|
|
Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
|
Оверрайд метода, который использован как callback
Сегодня заметил интересную штуку, о которой раньше даже не задумывался.
Есть у меня один класс, обертка для загрузчика картинок. В нем есть вот такая конструкция
Код AS3:
public function set imagePath(value:String):void {
if (_imageLoader) return;
_imagePath = value;
reset();
_imageLoader = new ImageLoader(onImageLoaded, _imagePath, onError);
}
public function get imagePath():String {
return _imagePath;
}
protected function onImageLoaded(image:Bitmap):void {
_imageLoader = null;
_image = image;
_image.smoothing = true;
addChild(_image);
addChild(_closeButton);
if (_width == 0 || _height == 0) {
_width = _image.width;
_height = _image.height;
}
drawMask();
}
Как можно увидеть выше, ссылка на метод передается объекту ImageLoader.
И есть класс наследник этой обертки, в котором делается перезапись этого метода
Код AS3:
override protected function onImageLoaded(image:Bitmap):void {
super.onImageLoaded(image);
image.alpha = .3;
addChild(_nameLabel);
}
Собственно, я всегда полагал, что когда в таком случае происходит вызов (здесь внетри ImageLoader'а) метода класса, то сначала он вызывается в наследнике, а потом, если там есть вызов метода суперкласса, уже передается в суперкласс.
Оказалось нифига подобного. Метод в наследнике не вызывается. То есть в данном случае, как колбэк передается именно жесткая ссылка на метод суперкласса как на объект, и никакие оверрайды уже не учитываются.
Вот такие вот пирожки, товарищи :D
Просто хотел поделиться находкой, которая мне чуть мозг не взорвала)
Решение:
Цитата:
Только что выяснил из-за чего все сломалось.
Там у меня в ImageLoader стоит блок try / catch, в котором вызывается этот колбэк.
И оказалось, что _closeButton в месте где она добавляется == null (как раз в этом методе). Но ошибки не вылетало из-за этого самого try /catch. Выполнение метода просто тихо отваливалось.
Всё, тему можно считать закрытой. Все работает, и дело не в ссылке на метод.
|
__________________
Ко мне можно и нужно обращаться на ты)
Последний раз редактировалось caseyryan; 02.02.2017 в 19:58.
Причина: Вопрос решен
|