Помощь · Поиск · Пользователи · Календарь
Полная версия этой страницы: Получить значения свойства одного класса из другого
Flash Zone Forum > Macromedia Flash > ООП во Flash
HaWK
Есть класс документа:
Код
package {
  
   import flash.display.MovieClip;

   public class Main extends MovieClip {
       public var myVar:int;
  
       public function Main() {
           myVar = 5;
       }
   }
}

И есть другой класс. Как мне из другого класса получить значение свойства myVar класса документа?
MustLive
Цитата
И есть другой класс. Как мне из другого класса получить значение свойства myVar класса документа?

Стандартным для ООП путём - через методы класса. Т.е. в одном классе (Main) ты создаёшь метод для доступа к свойству (myVar), а из другого класса (из любых других классов) к нему обращаешься.

Добавь в класс Main следующий метод:
Код
       public function getVar() {
           return myVar;
       }

При этом само свойство myVar ты можешь сделать private, а не public (чтобы только через методы можно было к нему обратиться). Иначе можно будет напрямую к свойству обращаться.

Код
Main MyObject = new Main();
trace(MyObject.getVar()); // обращение через метод (при myVar как public, так и private)
trace(MyObject.myVar); // обращение напрямую к свойству (при myVar как public)

При myVar как public возможно не только чтение, но и запись напрямую в свойство (MyObject.myVar = 1), а если бы myVar был private, то этого нельзя было бы сделать (ни прочитать, ни записать напрямую), и для записи нужно было бы сделать соответствующий метод.
HaWK
Вообще экземпляр класса документа создаётся только один раз, MustLive. Мне нудно получить именно из него это свойство.
Ты в курсе что такое класс документа?
MustLive
Цитата
Вообще экземпляр класса документа создаётся только один раз, MustLive. Мне нудно получить именно из него это свойство.

HaWK

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

Класс документа ты описал как class Main (т.е. я понял, что это какой-то твой класс). Вот я и привёл пример кода для работы с ним. Если это какой-то стандартный класс (а с классами AS3 я не знаком), поставляемый с флешем, то почитай его документацию или изучи исходник (если нет возможности/времени/желания читать документацию), и воспользуйся теми способами, что я описал выше. И прочитаешь значение этого свойства.
HaWK
Да это мой класс. И его экземпляр создаётся один раз (самим Flash). Вот как к нему обратится я не знаю.
MustLive
Цитата
И его экземпляр создаётся один раз (самим Flash). Вот как к нему обратится я не знаю.

Откуда ты знаешь, что он создаётся? Если ты об этом читал в какой-либо документации, то там и прочитай о том, как к данному экземпляру обратиться.

Чтобы проверить, что флеш автоматически создаёт экземпляр класса Main, возьми в конструкторе класса (function Main()) выведи трейс (за myVar), чтобы получить результат в окне Output:
Код
myVar = 5;
trace(myVar);

Если этот экземпляр создаётся (что ты проверишь вышеприведённым кодом), то у него есть имя. Вот имя этого экземпляра тебе н.б. выяснить. И по имени обращаться к свойству (одним из двух способов, что я описал ранее).
HaWK
ML!
Цитата
Откуда ты знаешь, что он создаётся? Если ты об этом читал в какой-либо документации, то там и прочитай о том, как к данному экземпляру обратиться.

Не нужно читать об этом, об этом уже пора знать. В AS3 совсем другая структура. Если допустим в AS2 я мог на руте объявить переменную и потом обращаться к ней с любого места программы просто через _root.myVar, то в AS3 так уже не получится. _root - теперь это класс документа и фиг знает как к нему обратится извне (с других классов). Если внутри него я ещё могу читать его же свойства, то извне не могу. Вот мне и надо выяснить как это делать, поэтому я создал тему.

Если бы мне просто надо было получить свойство я бы не писал здесь. Мне надо получить свойство класса документа (то бишь _root) из другого класса.
chingachgoog
Цитата(HaWK @ 18.10.2010 - 02:11) *
Если допустим в AS2 я мог на руте объявить переменную и потом обращаться к ней с любого места программы просто через _root.myVar, то в AS3 так уже не получится.


Да ну?
В конструкторе класса Документа пишем
Код
trace("Main "+(this==root))

И смотрим результат.

tongue.gif
HaWK
Ладно, я в курсе этого. Но почему когда я пишу в другом классе:
Код
trace(root.myVar);

Получаю:
1120: Обращение несуществующего свойства root.

? ? ?
chingachgoog
А в другом классе вообще может не быть свойства root, если это не потомок DisplayObject, либо оно может быть равным null.
HaWK
А как обратится к свойству экземпляра класса документа из другого класса?
chingachgoog
Передать в этот другой класс ссылку на себя при построении, например.

Типа:

// Из класса Документа
// var otherClass:OtherClass=new OtherClass(this)
HaWK
эээ.... и как всё это должно работать?
Как мне потом обращаться из этого другого класса?
chingachgoog
Код
package {
    import flash.display.*
    
    public class Main extends Sprite {
        public const DELTA="qewqw"
        public function Main(){
            var z=new A(this)
            z.use1()
        }
    }
}


Код
package {    
    public class A {
        var pat
        public function A(par){
            pat=par
        }
        public function use1(){
            trace("суперкласс "+pat.DELTA)
        }
    }            
}


Можно так. Можно в Main статическое свойство сделать с ссылкой на свой единственный экземпляр. Много способов.

PS

Кстати в AS1/2 _root может быть также не единственным.
HaWK
Вообще у меня конструктор другого класса занят другими параметрами, а тут в качестве параметра конструктору передаётся экземпляр документа класса. Всё так запутанно, лучше другие способы smile.gif, или это лучший?
chingachgoog
Цитата(HaWK @ 18.10.2010 - 13:46) *
тут в качестве параметра конструктору передаётся экземпляр документа класса.


Не экземпляр класса документа, а ссылка на экземпляр.
Второй способ я сказал. Третий и кувырнадцатый найдет тот кто ищет )))
HaWK
Я так понял лучше сделать так:
public static var prop:DisplayObject = this;

И потом обращаться в любом классе:
Main.prop.myvar

Хотя я ещё не пробовал, но надеюсь сработает
HaWK
Да... ни фига не получилось.
Вот:
1042: Ключевое слово "this" не может использоваться в статических методах. Оно может использоваться только в методах экземпляра, в закрытии функций и в глобальных кодах.
chingachgoog
Цитата(HaWK @ 19.10.2010 - 12:49) *
Да... ни фига не получилось.
Вот:
1042: Ключевое слово "this" не может использоваться в статических методах. Оно может использоваться только в методах экземпляра, в закрытии функций и в глобальных кодах.


Все правильно, в статических МЕТОДАХ как же можно использовать this?
Статические методы и свойства - это методы и свойства класса.

public static var prop:DisplayObject // просто объявляем
а вот в конструкторе класса уже вставим значение this:
prop=this
HaWK
Ошибочка:
trace(Main.prop.myVar);
1119: Обращение возможного неопределенного свойства myVar через ссылку со статическим типом flash.display:DisplayObject .
chingachgoog
Это тупой компилятор ругается, что программист забыл привести типы.
HaWK
Зачем обзывать компилятор? Это "наставник" бл* забыл подсказать программисту привести типы, чтобы потом вые*нутся.
chingachgoog
Цитата(HaWK @ 19.10.2010 - 13:51) *
Зачем обзывать компилятор? Это "наставник" бл* забыл подсказать программисту привести типы, чтобы потом вые*нутся.


У меня строгий режим компиляции не включен tongue.gif
Русская версия IP.Board © 2001-2011 IPS, Inc.