Читать переменную из другого класса в Actionscript 3 - PullRequest
0 голосов
/ 30 января 2012

Я уже установил переменную в своем классе документов "Main.as".Сейчас я пытаюсь получить доступ к этой переменной и прочитать ее значение из другого класса и функции, взять это значение и отправить его по электронной почте.

Например, в моем файле "Main.as" у меня есть эта функция:

public var _myVar:String;

function create() {
    _myVar = "hello";
}

Теперь из моего другого класса "EmailtoFriend.as" у меня есть новая функция, чтобы попытаться получить значение этой предварительно установленной переменной:

function getVar() {
    trace(_myVar);
}

Почему он не выведет "привет"?Вместо этого я получаю сообщение об ошибке: Доступ к неопределенному свойству _myVar.Если бы я мог просто заставить этот простой пример работать, я думаю, что это поможет мне понять многие вещи.Спасибо!

Ответы [ 5 ]

1 голос
/ 31 января 2012

Ошибка, которую вы получаете, действительно говорит обо всем.Хотя _myVar определен в вашем Main классе public var _myVar:String;, он не определен в вашем Emailtofriend классе.Если вы хотите получить доступ к _myVar, вам нужно выполнить одно из следующих действий:

Разобрать ссылку на ваш объект Main (используя this) на ваш EmailToFriend класс:

Main.as (класс документа) :

package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {
        public var _myVar:String;

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        public function create():void
        {
            _myVar = "hello";

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            create();

            var emailToFriend:EmailToFriend = new EmailToFriend(this);
            emailToFriend.getVar();

        }// end function

    }// end class

}// end package

internal class EmailToFriend
{
    private var _main:Main;

    public function EmailToFriend(main:Main)
    {
        _main = main;

    }// end function

    public function getVar():void
    {
        trace(_main._myVar);

    }// end function

}// end class

Или сделать _myVar открытым статическим свойством Main и получить к нему доступ через Main._myVar:

Main.as (класс документа) :

package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {
        public static var _myVar:String;

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        public function create():void
        {
            _myVar = "hello";

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            create();

            var emailToFriend:EmailToFriend = new EmailToFriend();
            emailToFriend.getVar();

        }// end function

    }// end class

}// end package

internal class EmailToFriend
{
    public function EmailToFriend() {}

    public function getVar():void
    {
        trace(Main._myVar);

    }// end function

}// end class

Кроме того, при использовании подчеркиваний для свойств класса их следует использовать только для частных свойств, а не для открытых.Ну, я говорю только , но я действительно имею в виду, что это более распространено.

[ОБНОВЛЕНИЕ]

Это в ответ на ваш комментарий:

Main.as :

package 
{
    import EmailToFriend;
    import flash.display.Sprite;
    import flash.events.Event;


    public class Main extends Sprite 
    {
        public static var _myVar:String;

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        public function create():void
        {
            _myVar = "hello";

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            create();

            var emailToFriend:EmailToFriend = new EmailToFriend();
            emailToFriend.getVar();

        }// end function

    }// end class

}// end package

EmailToFriend.as :

package  
{
    import Main;

    public class EmailToFriend 
    {
        public function EmailToFriend() {}

        public function getVar():void
        {
            trace(Main._myVar);

        }// end function

    }// end class

}// end package
1 голос
/ 30 января 2012

Все переменные неявно имеют цель, если явно не указано.Переменные без явной цели обычно будут выглядеть в локальной области действия функции (в данном случае getVar()) и глобальной области видимости класса (в данном случае EmailToFriend).

Я предполагаю, что их нет в вашем коде, судя по ошибке.Вам понадобится что-то вроде следующего для доступа к var:

function getVar() {
    var main:Main = new Main();
    main.create();
    trace(main._myVar);
}
0 голосов
/ 14 апреля 2014

Что вам нужно сделать, так это использовать подход ООП, что означает использование инкапсуляции в ваших классах.Если вы не знаете, что это значит, все в порядке.Например, если у вас есть переменная, которую вы хотите сделать доступной, тогда вам действительно нужно сделать ее закрытой, и настроить собственную публичную функцию, которая возвращает переменную.Например:

package {

public class SomeClass {
    private var someVar:Number = 12; // A private variable, which means only this class can
// use the reference someVar, and only other outiside classes can use the function getSomeVar.
    ... // skip some regular class stuff

    public function getSomeVar():Number {
        return this.someVar; //returns the variable someVar from this class to whoever is accessing it. 
//This function is public which means that anyone can call it and get the variable someVar.
    }
}
}

Чтобы получить доступ к этой переменной, вы просто ссылаетесь на экземпляр класса:

var someClass:SomeClass = new SomeClass(); // create the instance using the variable someClass
var myVar:Number = someClass.getSomeVar(); // ACCESSES the variable that you want from the class, 
//by first using the class instance reference, and then calling its public function that returns the value you want.
0 голосов
/ 30 января 2012

Предполагая, что Main.as является вашим классом документов:

public var _myVar:String;

public function create():String {
//we specify that this function will return a String using the :String in the above line

    //now give the variable a value
    _myVar = "hello";

    //and send it back to the caller of the function
    return _myVar;
}

В вашем другом классе

function getVar():void {

    //MovieClip(root) is another way of referencing your document class.
    trace(MovieClip(root).create());
}

ИЛИ ...

public var _myVar:String;

public function create():void {

    //now give the variable a value
    _myVar = "hello";

}

В вашем другомкласс

function getVar():void {

    //call the function that actually gives myVar a value
    MovieClip(root).create();

    //now you can trace the value
    trace(MovieClip(root)._myVar);
}
0 голосов
/ 30 января 2012
  package {
    import flash.display.MovieClip;  
    public class Main extends MovieClip  {
       public var _myVar:String;
       public function Main(){
         create();
       }
       private function create() {
          _myVar = "hello";
         }
      }
      }
    }

в EmailtoFriend.a

import Main.as
var myMain = new Main();
trace(myMain._myVar);
...