Можно ли читать переменные из основного скрипта внутри функций класса?

Я изучаю ActionScript 2.0, анализируя некоторый свободно доступный исходный код и изменяя его, и я наткнулся на небольшую заминку.

У меня есть 3 файла .as, которые идут с моим .fla, и это:

"script.as" содержит все основные функции, которые используются во встроенном флэш-интерфейсе.
"skin.as" содержит объявление класса оболочки интерфейса и функции класса.
"defaultskin.as" содержит объявление класса и функции, расширяющие "скин" класса.

Первый кадр .fla просто #includes "script.as", и я связал фрагмент ролика "interface" (который является моим основным интерфейсом Flash) с классом "defaultskin" с помощью меню правой кнопки мыши / свойств в связке ActionScript.

У меня есть переменная, объявленная в "script.as" с помощью простого оператора var. Может ли эта переменная быть прочитана в одной из функций внутри "skin.as" одной из функций класса как есть? Или мне нужно сделать что-то особенное, чтобы он был доступен для чтения этому классу?

Как это можно сделать, не делая переменную общедоступной статической и не передавая ее в качестве аргумента функции?

Для дополнительного пояснения, script.as выглядит примерно так (предположим, что m_interface - это имя объекта мувиклипа):

//imports

var myVar;

onLoad()
{
 m_interface.Initialize();
}

skin.as выглядит примерно так:

//imports

class skin
{
 //variable declarations

 public function skin()
 {
  // code
 }

 function Initialize()
 {
  trace(myVar);
 }
}

без написания всего лишнего кода defaultskin.as объявляет класс как таковой:

class defaultskin extends skin

person Darxide    schedule 30.05.2014    source источник


Ответы (1)


по умолчанию вы используете var, это дает ему internal модификатор доступа. поэтому к нему может получить доступ только класс или любой класс в том же пакете, поэтому, если вы не используете какие-либо другие модификаторы или не передаете эту переменную каким-либо образом своему классу, ответ будет «нет, это недоступно», если вы используйте модификатор public, вы даете доступ к переменной любому классу, но есть некоторые другие ограничения, как вы уже заметили, для доступа вы добавляете модификатор static, что означает, что вам не нужно создавать экземпляр класса, чтобы иметь доступ к переменной public static.

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

var newClassInstance = new ClassName();
trace(newClassInstance.varible);

другой способ - это ваш экземпляр класса skin, расположенный внутри класса script.as ... так что где-то внутри script. как есть переменная со ссылкой на экземпляр скина. в этом случае вы можете получить доступ к переменным экземпляра script.as, используя _parent из skin.as

person Aspiro    schedule 30.05.2014
comment
Я так подозревал, но все равно решил спросить. Спасибо за ваш ответ. Скорее всего, я в конечном итоге изменю функции класса, чтобы передать переменную в качестве аргумента. Это становится проблематично, поскольку есть места, где основной файл script.as вызывает функцию в defaultskin.as, которая затем, в свою очередь, вызывает skin.as, поэтому мне придется изменить обе функции, а также изменить все вызовы функций чтобы включить дополнительный аргумент. Дополнительная работа, но, по крайней мере, она выполнит свою работу без использования общедоступных переменных. - person Darxide; 31.05.2014
comment
Обновлено: я думаю, вы можете использовать ключевое слово public для объявления переменных, если они находятся в классе. Думаю, я буду переписывать всю ночь, чтобы передать переменные. - person Darxide; 31.05.2014
comment
Вместо передачи самих переменных вы, вероятно, могли бы передать ссылку на экземпляр класса, чтобы получить доступ к его переменным. Создание функций, которые все используют аргументы, которые всегда имеют одно и то же значение, не является ООП. Но as2 действительно не так ООП во многих отношениях ... - person Aspiro; 31.05.2014
comment
Как передать ссылку на экземпляр класса? У меня есть более двух десятков переменных, на которые мне нужно ссылаться внутри и вне класса, и это делает передачу их как отдельных переменных реальной проблемой и причиной, по которой я не хочу этого делать. Если я могу передать ссылку на класс, а также получить доступ к функциям, это также значительно упростит мой сценарий. - person Darxide; 02.06.2014
comment
Давайте использовать собственные имена. Для простоты класс - это своего рода шаблон, который содержит список соответствующих данных и типов, например, этого класса. С другой стороны, экземпляр этого класса является объектом, в котором хранятся фактические данные. Например, класс - это человек, и мы с вами - фактические экземпляры этого класса, оба имеют одинаковый список свойств и функций, но имеют разные значения. - person Aspiro; 09.07.2014
comment
Я думаю, вам не нужна ссылка на класс. Если вам нужен доступ к реальным данным, вам нужно передать ссылку на конкретный экземпляр класса (если мы говорим о классическом использовании модели ООП). И вы могли бы сделать это, например, передав ссылку на другой конструктор класса. Или вы можете присвоить эту ссылку как свойство любому экземпляру динамического класса. Если вы действительно уверены, что хотите хранить данные внутри статических свойств класса, вам не нужны операции передачи. Все, что вам нужно сделать, это импортировать свой статический класс в нужный сценарий, а затем получить доступ к любому из его свойств с помощью кода ClassName.staticPropertyName. - person Aspiro; 09.07.2014