Показать сообщение отдельно
Старый 02.02.2017, 13:24
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 1  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
По умолчанию Оверрайд метода, который использован как 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. Причина: Вопрос решен