PDA

Просмотр полной версии : Ошибка при передаче параметра в функцию


Волгоградец
20.08.2008, 16:13
Привет еще раз. Помогите понять вот что:

private function init(e:Event):void{
e.target.addEventListener(MouseEvent.MOUSE_DOWN, startTest);
}

private function startTest(e:MouseEvent):void{
trace (e.target is Sprite);//true
test(e.target);//ошибка: Implicit coercion of a value with static type Object to a possibly unrelated type flash.display:Sprite.
test2(e.target);//работает
}

private function test(mc:Sprite):void{
mc.x += 50;
}
private function test2(mc:Object):void{
mc.x += 50;
}
Почему эта ошибка?

etc
20.08.2008, 16:39
Вы думаете, что интерпретатор сам прокастит target в Sprite?
test(e.target as Sprite);

Волгоградец
20.08.2008, 16:58
Я думал, что интерпретатору знает, что target является спрайтом. Ведь
trace (e.target)
правильно же выдает - [object Sprite].

etc
20.08.2008, 17:04
Вы пытаетесь передать в функцию абстракный объект, вместо Sprite. То, что ссылка указывает на Sprite, компилятор ещё не знает.

Волгоградец
20.08.2008, 17:25
Ок. Спасибо, __etc. Запомню это, хотя не понятно все равно - если компилятор не знает, то кто же трэйсит тогда [object Sprite]?? И если передавать просто объект Object, то почему работает - ведь компилятор же не знает, что я передаю DisplayObject, почему пропускает тогда без ошибки? И что такое абстрактный объект? И откуда вы все это знаете?

etc
20.08.2008, 17:30
Трейс делает интерпретатор, а не компилятор. Ошибка у вас ещё на стадии компиляции, потому что компилятор проверяет все типы и не даст скомпилировать некоррентный код.

Из документации я все это знаю и из простейшего понятия типизации, а также того, что Object — dynamic.

Яски
20.08.2008, 17:41
И вообще то Object является базовым классом для всех классов в АС3.

Волгоградец
20.08.2008, 17:52
Все, догнал. Спасибо за помощь! Пойду документацию зубрить.

enepx
20.08.2008, 20:00
Волгоградец, я всегда пишу так

(e.target as Sprite).addEventListener...

Может быть и не только Sprite же