Класс ActionScript 3 MovieClip - PullRequest
       12

Класс ActionScript 3 MovieClip

1 голос
/ 09 августа 2009

Я просто играю с базовым ActionScript 3, используя Flash CS3 Pro.

Я вставил в ключевой кадр этот очень простой код, чтобы дублировать n символов «брандера»:

for (var i:Number=0; i<20; i++) {
    var m = new brander("MS_"+i);
    addChild(m);
    m.name = "MS_"+i;
    m.x = 20*i;
    m.alpha = a;
    a-=0.05;
    m.y = 20;
}

Символ связан с классом brander.as.

Это класс:

package {
    import flash.display.*;
    public class brander extends MovieClip {
        var n:String;
        //
        public function brander(name) {
            setName(name);
        }
        //
        function setName(name) {
            this.n = name;
        }
        //
        function getName() {
            return n;
        }
    }
}

и это тоже просто.

Теперь: я заметил, что не могу ничего установить в этом классе. Поэтому, когда я вызываю setName (при создании экземпляра "brander"), я ничего не устанавливаю. Это возможно?

Я тестировал без отладки, просто написав:

btn.addEventListener(MouseEvent.MOUSE_DOWN, test);
//
function test(EVT) {
    trace(this.getChildByName("MS_2").getName());
}

Почему мы связываем класс, если этот класс не может хранить информацию? Что я делаю не так?


EDIT:

Я обнаружил, что это работает:

function fun(EVT) {
    trace((this.getChildByName("M_2") as brander).getName());
}

но я не могу понять ПОЧЕМУ: не могли бы вы сказать мне, почему?

1 Ответ

1 голос
/ 09 августа 2009

Причина в том, что функция getChildByName () возвращает DisplayObject. У DisplayObject нет функции getName. Класс brander, однако, наследует (расширяет) DisplayObject, и поэтому вы можете сохранить его как DisplayObject. Но если вы хотите вызвать какую-либо из функций брандера, вам нужно сначала привести ее к брандеру, используя as.

Существует много информации о кастинге , полиморфизме и наследовании нескольких местах в Интернете.

...