PDA

Просмотр полной версии : Глобальное свойство


Михаил Свинцов
29.02.2012, 14:08
Допустим у меня есть класс в котором хранятся ссылки на экземпляры других классов. Чтобы пользоваться этими ссылками надо в каждый класс в котором они хранятся написать
var ref = new Ref();.

А вопрос вот в чем можно ли как-то объявить эту переменную(ref) на уровне пакета чтоб не загромождать код этими строками(т.к. классов(небольших правда) будет около 50)????

Inet_PC
29.02.2012, 14:17
public static var ref: Ref = new Ref(); И в любом месте можно обратиться, как имя_класс.ref. Если я вас правильно понял.

Zebestov
29.02.2012, 14:17
Можно в классе Ref пометить все ссылки как static и пользоваться ими из любого места:

Ref.someReference

Добавлено через 28 секунд
А еще есть синглтон.

Михаил Свинцов
29.02.2012, 14:22
у меня итак в Ref все экземпляры объявлены статическими(точнее переменные в которых они храняться), но не известно по какой причине я не могу обратиться к этим переменным из других классов(а я обращаюсь - Ref.primer) без приведенной в первом сообщении строки

Добавлено через 1 минуту
А еще есть синглтон

А это что такое??? можно поподробнее

Zebestov
29.02.2012, 14:29
у меня итак в Ref все экземпляры объявлены статическими..., но не известно по какой причине я не могу обратиться к этим переменным из других классов
Может ты просто забыл import?

А это что такое??? можно поподробнее
Птщь (http://ru.wikipedia.org/wiki/%D0%9E%D0%B4%D0%B8%D0%BD%D0%BE%D1%87%D0%BA%D0%B0_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0 %B0%D0%BD%D0%B8%D1%8F)#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.80_.D0.BD.D0.B0_ActionScript.C2.A03)

Михаил Свинцов
29.02.2012, 14:33
а нужно делать импорт если все в одном пакете??

Zebestov
29.02.2012, 14:35
Нет. Но тогда остается загадкой, почему не получается обратиться к статическому полю класса указанным ранее образом. Код бы посмотреть. Твоего Ref, твоего обращения.

Михаил Свинцов
29.02.2012, 14:40
Вот Основной класс
package p {
import flash.display.*;
import flash.net.*;
import flash.events.*;
import flash.text.*;
import flash.display.Sprite;

public class Application extends MovieClip {
public function Application() {
trace("Конструктор основного класса Application");
trace(Ref._panel);
// Часть кода я выпустил т.к. он тут вообще не при чем.
}
}
}

Добавлено через 2 минуты
а вот сам Ref
package p {
import flash.display.*;
import flash.display.Sprite;

public class Ref extends Sprite {
public static var _glav0;
public static var _glav1;
public static var _panel;

public function Ref(){
_glav0 = new Glava0();
_glav1 = new Glava1();
_panel = new Panel();
}
}
}

Добавлено через 3 минуты
выводит кстати в аутпат вот это


Конструктор основного класса Application
undefined
TypeError: Error #2007: Parameter child must be non-null.
at flash.display::DisplayObjectContainer/addChild()
at p::Application$iinit()[C:\Users\Михаил\Documents\biolog8\src\p\Application.as:12]

Добавлено через 6 минут
если я добавляю строку var ref = new Ref(); в основной класс тогда вместо undefined выводит [object Panel]

Inet_PC
29.02.2012, 14:51
Естественно Вы же нигде ни разу не создали экземпляр класса, в конструкторе которого и инициализируются статические переменные. Либо где нибудь один раз напишите var ref = new Ref(); да хоть в Ref:
public static var instance:Ref = new Ref();Либо:
package p {
import flash.display.*;
import flash.display.Sprite;

public class Ref extends Sprite {
public static var _glav0= new Glava0();
public static var _glav1 = new Glava1();
public static var _panel = new Panel();

public function Ref(){

}
}
}
И не помешает почитать чем отличается статическая переменная от не статической.

Zebestov
29.02.2012, 14:56
package p {
public class Ref {
public static var glav0:Glava0 = new Glava0();
public static var glav1:Glava1 = new Glava1();
public static var panel:Panel = new Panel();

public function Ref()
{
}
}
}
Публичные поля ни к чему начинать с подчеркивания.

Михаил Свинцов
29.02.2012, 15:11
я знаю что так не надо делать, но мне легче отличать из-за _

Добавлено через 59 секунд
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at p::Glava0$iinit()[C:\Users\Михаил\Documents\biolog8\src\p\Glava0.as:34]
at p::Ref$cinit()
at global$init()[C:\Users\Михаил\Documents\biolog8\src\p\Ref.as:5]
at p::Application$iinit()[C:\Users\Михаил\Documents\biolog8\src\p\Application.as:11]

я все сделал как вы и сказали но возникла ошибка

Inet_PC
29.02.2012, 15:18
Ну ошибка видимо в Glava0 на 34 строке. А, что там, никто понятия не имеет.

Zebestov
29.02.2012, 15:20
Чую обращение к stage в конструкторе )

Михаил Свинцов
29.02.2012, 15:22
неа я убрал все обращения к stage уже давно))))

Добавлено через 1 минуту
а там(как раз и назначение этих ссылок) переменная Ref._glav1 передается в конструктор как параметр. Я над этим тоже дума можно это или нет но остановился все таки на МОЖНО

Добавлено через 3 минуты

ch1 = new CreateButton("................................", 14, 0x0000ff, "Segoe Print",
true, false, 280, 40, 100, 100, TextFieldAutoSize.LEFT,
TextFormatAlign.LEFT, false, null, false, null, true,
Ref._glav1)

Добавлено через 4 минуты
а stage я убрал потому что я все равно ничего толкового от нее не дождался

Zebestov
29.02.2012, 15:27
Зачем же такое делать? Стоило ли делать ссылки статическими, чтобы потом передавать их в качестве аргументов? 0о

Михаил Свинцов
29.02.2012, 15:30
тогда как мне сделать

Zebestov
29.02.2012, 15:31
Ок. Полагаю, вопрос про статические поля/методы исчерпан. Остальное выходит за рамки как темы, так и, мне кажется, здравого смысла =)
тогда как мне сделать
Создавай новую тему с новым предметным вопросом.

Михаил Свинцов
29.02.2012, 15:34
да кстати я и сам забылся можно ли все таки как-нибудь объявить переменную на уровне пакета, на подобии _global.primer в AS1